2011-02-24 84 views
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!」我已經多次閱讀關於類型的章節,試圖弄清楚這一點。谷歌也非常無用。我認爲我還沒有完全理解打字。任何人都可以解釋發生了什麼問題?

回答

7
myTake n - 1 ls 

被解析等

(myTake n) - (1 ls) 

因爲功能應用程序綁定比任何綴運算符更高。括號內:

myTake (n - 1) ls 
+0

謝謝,解決了它。我很高興這只是一個簡單的事情。 – 2011-02-24 04:40:58

+1

作爲一個經驗法則,如果它們不僅僅是一個變量名稱,則總是將括號表達式作爲前綴函數的參數。 – fuz 2011-02-24 18:29:13

+1

注意這就是爲什麼'x:fy'可以工作的原因,因爲函數應用程序'fy'比':'綁定的更緊密,所以就好像你使用了括號'x:(fy)' – 2011-02-24 21:06:12