Просто борется с Haskell ... у меня довольно плохая терминология, и, учитывая, что мой родной язык не является английским, немного сложно сделать правильные поиски: P я следил за некоторыми учебниками/книгами по хэскелю (узнайте, что вы Haskell , Real World Haskell, Happy Learn Haskell, также список рассылки, и некоторые случайные страницы), и теперь я остановился здесь:Haskell: Соответствие шаблону (x: _): почему голова списка ограничена x?
head' :: [Char] -> Char
head' (x:_) = x
Эта функция получает список элементов строкового типа, и если я применить это так:
head' "hello"
возвращает «н», которая ограничена х, и «ELLO» ограничена на _, но это не п потому что я не использую его. Я понимаю, что функция (:) (или используется как инфиксный оператор) получает элемент, который будет помещен, и начало нового списка, хвостом которого будет другой полученный элемент: 'a' : ['b', 'c']
вернется «abc». Но почему когда я использую «:» внутри круглых скобок, первый элемент ограничен x, а остальное - _? Что здесь происходит?
Я прочитал несколько SO вопросов, как этот (x:xs) pattern Haskell logic и это (что более ближе, чтобы ответить на мой вопрос я думаю) What does (x:_) and [x:_] mean? но принятый вопрос этого последнего говорит: «: это конструктор для списков, который принимает глава нового списка в качестве его левого аргумента и хвост в качестве его правильного аргумента. Если вы используете его как шаблон, как здесь, это означает, что голова списка, которую вы сопоставляете, указана на правильный рисунок и хвост слева. «
« Голова списка указана справа, а хвост слева »... это меня действительно смущает: если голова дается« _ », а хвост -« x », когда используется «:» при сопоставлении с образцом, почему x имеет значение e из списка?
Я думаю, может быть, это мой плохой уровень английского языка, из-за которого мне трудно понять это ха-ха. Я также ценю некоторые подсказки (например, конкретный поиск) вместо прямого ответа :)
Спасибо :)
EDIT: Для другого нуба, как я .... как сказал принятому ответом , «abcd» - это просто «a»: «b»: «c»: «d», шаблон (x: _) соответствует «a»: «b» и т. д., подчеркивание означает «мне все равно» о остальном ", и получает остальные персонажи. Только что :)
Это должно быть ошибка, часть слева должна совпадать с заголовком списка. –
Это была опечатка. Теперь это исправлено. – sepp2k
@EarlGray Ну, теперь я чувствую себя лучше, я думаю, ха-ха. Но я все еще не понимаю: почему хвост ограничен? Haskell автоматически читает «(x: _)» и говорит «хорошо, я привяжу голову к x, а остальное - к _»? Или «:», когда используется при сопоставлении с образцом между скобками, имеет другое значение? Потому что (x: _) для моего понимания «положил x в начале _» ... Это может быть глупый вопрос, извините :) –