我正在尝试编写一个Haskell附加函数......这就是我所拥有的:
myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y
但它给了我一个错误: 发生检查:无法构造无限类型:a = [a] 在推广“myappend”
的类型时所以,显然它有问题但是我看不到它...我的追加功能出了什么问题?
答案 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]
匹配由另一个列表组成的一个项目列表。