Haskell Noob问题:我的追加函数出了什么问题?

时间:2009-11-08 11:54:29

标签: haskell functional-programming append

我正在尝试编写一个Haskell附加函数......这就是我所拥有的:

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

但它给了我一个错误:     发生检查:无法构造无限类型:a = [a]     在推广“myappend”

的类型时

所以,显然它有问题但是我看不到它...我的追加功能出了什么问题?

3 个答案:

答案 0 :(得分:13)

[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]]

如果您想了解构造函数和模式匹配概念,我建议您阅读this page

答案 1 :(得分:4)

该函数的第二种情况中的模式应该是(x:xs),而不是[x:xs]

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

x:xs匹配一个元素后跟一个列表,括号只是为了使它在语法上清楚属于该模式的内容。 [x:xs]会匹配包含x:xs的列表。

答案 2 :(得分:1)

不应该有[]个括号 myappend (x:xs) y = x : (myappend xs y)

[1,2,3]1:2:3:[]是定义相同列表的不同方式。 因此[x:xs]匹配由另一个列表组成的一个项目列表。