3
我在教自己Haskell和學習任何編程語言的最好方法就是使用它。我目前的「練習」是take的實現。僞代碼是:Haskell遞歸和類型錯誤
take(0, list) = [] --empty list
take(n, list) = const(head(list), take(n-1, tail(list))
我一直在Haskell制定是:
myTake :: (Num a) => a -> [b] -> [b]
myTake 0 l = []
myTake n (l:ls) = l : myTake n-1 ls
,當我在GHCI加載的文件這不編譯。這是我得到的錯誤消息:
Couldn't match expected type `[b]'
against inferred type `[b1] -> [b1]'
In the second argument of `(:)', namely `myTake n - 1 ls'
In the expression: l : myTake n - 1 ls
In the definition of `myTake':
myTake n (l : ls) = l : myTake n - 1 ls
我當前的Haskell資源是「學習你一個好主意的Haskell!」我已經多次閱讀關於類型的章節,試圖弄清楚這一點。谷歌也非常無用。我認爲我還沒有完全理解打字。任何人都可以解釋發生了什麼問題?
謝謝,解決了它。我很高興這只是一個簡單的事情。 – 2011-02-24 04:40:58
作爲一個經驗法則,如果它們不僅僅是一個變量名稱,則總是將括號表達式作爲前綴函數的參數。 – fuz 2011-02-24 18:29:13
注意這就是爲什麼'x:fy'可以工作的原因,因爲函數應用程序'fy'比':'綁定的更緊密,所以就好像你使用了括號'x:(fy)' – 2011-02-24 21:06:12