Вопрос Haskell Noob: что не так с моей функцией добавления?

Я пытаюсь написать функцию добавления Haskell ... Вот что у меня есть:

myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y

Но это дает мне ошибку: Происходит проверка: невозможно построить бесконечный тип: a = [a] При обобщении типа (ов) для `myappend '

Итак, очевидно, что с этим что-то не так, но я этого не вижу ... Что не так с моей функцией добавления?


person Paul Hollingsworth    schedule 08.11.2009    source источник


Ответы (3)


Конструкторы типа [a]:

[]  The empty list
(:) Cons operator (just a regular infix constructor)

Итак, вы должны использовать:

myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend (x:xs) y = x : myappend xs y

Синтаксис

[x:xs]

в значительной степени эквивалентен

[(x:xs)]

который соответствует списку с одним элементом, непустому списку и имеет тип

[(x:xs)] :: [[a]]

Я рекомендую прочитать эту страницу, если вы хотите понять конструктор и концепцию сопоставления с образцом.

person fishlips    schedule 08.11.2009
comment
Ах ах! Глупые квадратные скобки. Теперь я это вижу! О чем я только думал!? Спасибо! - person Paul Hollingsworth; 08.11.2009

Образец во втором случае функции должен быть просто (x:xs), а не [x:xs]:

myappend (x:xs) y = x : myappend xs y

x:xs соответствует элементу, за которым следует список, круглые скобки служат только для синтаксической ясности того, что принадлежит этому шаблону. [x:xs] соответствует списку, содержащему x:xs.

person sth    schedule 08.11.2009

В myappend (x:xs) y = x : (myappend xs y) не должно быть [] скобок.

[1,2,3] и 1:2:3:[] - разные способы определения одного и того же списка. Таким образом, [x:xs] соответствует одному списку элементов, состоящему из другого списка.

person Rafał Rawicki    schedule 08.11.2009