我想写一个Haskell附加功能......这是我有:Haskell Noob问题:我的追加函数有什么问题?
myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y
但它给我一个错误: 出现,请检查:无法构造无限类型:A = [A] 当概括'myappend'的类型时
所以,显然它有什么问题,但我看不到它......我的追加函数有什么问题?
我想写一个Haskell附加功能......这是我有:Haskell Noob问题:我的追加函数有什么问题?
myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y
但它给我一个错误: 出现,请检查:无法构造无限类型:A = [A] 当概括'myappend'的类型时
所以,显然它有什么问题,但我看不到它......我的追加函数有什么问题?
类型的构造[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如果你想了解的构造和模式匹配的概念。
应该没有[]
括号 myappend (x:xs) y = x : (myappend xs y)
[1,2,3]
和1:2:3:[]
是定义该列表的方式不同。 因此[x:xs]
匹配由另一个列表组成的一个项目列表。
在函数的第二种情况的模式应该仅仅是(x:xs)
,不[x:xs]
:
myappend (x:xs) y = x : myappend xs y
x:xs
元素后跟一个列表匹配,括号就在那里,使其语法明确属于什么那种模式。 [x:xs]
将匹配包含x:xs
的列表。
啊哈!愚蠢的方括号。我现在看到它!我在想什么!?谢谢! –