2009-11-08 51 views
1

我想写一个Haskell附加功能......这是我有:Haskell Noob问题:我的追加函数有什么问题?

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

但它给我一个错误: 出现,请检查:无法构造无限类型:A = [A] 当概括'myappend'的类型时

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

回答

13

类型的构造[A]是:

所以,你必须使用:

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

语法

[x:xs] 

相当于

几乎
[(x:xs)] 

它匹配一个元素,一个非空列表的列表,且类型

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

我建议你阅读this page如果你想了解的构造和模式匹配的概念。

+0

啊哈!愚蠢的方括号。我现在看到它!我在想什么!?谢谢! –

1

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

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

4

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

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

x:xs元素后跟一个列表匹配,括号就在那里,使其语法明确属于什么那种模式。 [x:xs]将匹配包含x:xs的列表。