2009-11-08 78 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的列表。