2016-07-23 5 views
0

Просто борется с 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» и т. д., подчеркивание означает «мне все равно» о остальном ", и получает остальные персонажи. Только что :)

+0

Это должно быть ошибка, часть слева должна совпадать с заголовком списка. –

+0

Это была опечатка. Теперь это исправлено. – sepp2k

+0

@EarlGray Ну, теперь я чувствую себя лучше, я думаю, ха-ха. Но я все еще не понимаю: почему хвост ограничен? Haskell автоматически читает «(x: _)» и говорит «хорошо, я привяжу голову к x, а остальное - к _»? Или «:», когда используется при сопоставлении с образцом между скобками, имеет другое значение? Потому что (x: _) для моего понимания «положил x в начале _» ... Это может быть глупый вопрос, извините :) –

ответ

7

Список тип данных определяется следующим образом:

data [a] = [] | a : [a]

Это означает, что список a s либо пусто, либо голова элемент, прикрепленный к хвостовой элемент, используя : (cons) конструктор.

Когда вы сопоставляете шаблон по списку, вы определяете свою функцию для каждого из этих двух случаев. В случае с head' он просто терпит неудачу, когда ему присваивается пустой список, поэтому мы сопоставляем только один случай: случай a : [a].

Если вы назвали head' "hello" (как она существует сейчас, с типом подписи в комплекте) он должен потерпеть неудачу, потому что "hello" фактически String - псевдоним для [Char] в Haskell.«Привет» это просто синтаксический сахар для следующей конструкции:

"hello" = 'h':'e':'l':'l':'o':[]

Итак, когда вы шаблон матч в списке с помощью head', вы получаете 'h' на левой стороне первого :, а остальная часть список (который нас не волнует), связанный с _.

+0

У типовой подписи была опечатка, у меня есть исходный код на моем компьютере, поэтому я не копировал ее. Теперь исправлено, извините :) –

+0

После некоторого кодирования и повторного чтения вашего вопроса и EarlGray's, я думаю, я это понимаю :) Большое вам спасибо. Я очень ценю вашу помощь :) –

+0

Как 'data [a] = [] | a: [a] 'valid? Я не могу сделать что-то подобное в ghci: 'data TestType = Integer | Integer: [Integer] ' –

Смежные вопросы