我想寫一個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
的列表。
啊哈!愚蠢的方括號。我現在看到它!我在想什麼!?謝謝! –