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

Pau*_*rth 1 haskell functional-programming append

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

myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y
Run Code Online (Sandbox Code Playgroud)

但是它给了我一个错误:发生检查:无法构造无限类型:a = [a]当推广`myappend'的类型时

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

fis*_*ips 13

[a]类型的构造函数是:

[]  The empty list
(:) Cons operator (just a regular infix constructor)
Run Code Online (Sandbox Code Playgroud)

所以,你必须使用:

myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend (x:xs) y = x : myappend xs y
Run Code Online (Sandbox Code Playgroud)

语法

[x:xs]
Run Code Online (Sandbox Code Playgroud)

几乎相当于

[(x:xs)]
Run Code Online (Sandbox Code Playgroud)

它将列表与一个元素,一个非空列表匹配,并具有类型

[(x:xs)] :: [[a]]
Run Code Online (Sandbox Code Playgroud)

如果您想了解构造函数和模式匹配概念,我建议您阅读此页面.