2011-02-24 11 views
3

私は自分自身にハスケルを教えています。プログラミング言語を学ぶ最も良い方法はそれを使うことです。私の現在の「エクササイズ」はテイクの実装です。擬似コードです:ハスケル再帰と型エラー

take(0, list) = [] --empty list 
take(n, list) = const(head(list), take(n-1, tail(list)) 

私はHaskellで出て働いてきたことである:私はGHCiの中のファイルをロードするとき、これは

myTake :: (Num a) => a -> [b] -> [b] 
myTake 0 l = [] 
myTake n (l:ls) = l : myTake n-1 ls 

コンパイルされません。これは私が取得エラーメッセージです:

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を学ぼう!」です私はこれを理解しようと数回タイプのセクションを読んだ。 Googleはそれほど役に立たない。私はまだ完全にタイピングを理解していないと思う。誰が何がうまくいかないのか説明できますか?関数アプリケーションは、任意の中置演算子よりも結合するので

答えて

7
myTake n - 1 ls 

(myTake n) - (1 ls) 

ように解析されます。中括弧:

myTake (n - 1) ls 
+0

ありがとうございました。私はそれがちょうどそのような単純なものだったことがうれしいです。 –

+1

接尾辞関数の引数である式を常に括弧でくくってください。 – fuz

+1

これは、関数アプリケーション 'fy'が': 'よりも緊密にバインドされているため、' x:fy'が機能する理由に注意してください。 'x:(fy)'を括弧で括っているかのようにです。 –