は、95ページの、「実世界Haskellのを」読む著者は例を提供します。関数は3つではなく4つの引数を取ります - なぜこれは壊れませんか?
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
私の質問は:なぜ、このコードはコンパイルのでしょうか? foldr
には3つの引数しかありませんが、ここでは4つを渡します:step
、id
、xs
、z
。 (合計が1を想定しているため)
例えば、これは動作しません:
sum filter odd [1,2,3]
ではなく、私が書く必要があります。
sum $ filter odd [1,2,3]
私はあなたが 'id id 5'をなぜ行うことができるのか分かりませんが、あなたはできません:' foo x = x + 1;バーy = y + 1; foo bar 1'? – drozzy
@drozzy - 型と多型に関するすべてです。 'id :: a - > a'を取る:' a'に*任意の*型を代用することができます。しかし、 'foo'は制約があるため、異なる:' foo ::(Num a)=> a - > a'という数字が必要です。 'bar ::(Num a)=> a - > a'は' Num'型のインスタンスではないので、 'foo'の'(Num a) '制約を満足しません。 –
@drozzyおそらく関数アプリケーションの結合性を明らかにすれば助けになるでしょう! 'id id 5'は '(id id)5 'として解析されます。つまり' id'を最初に引数として 'id'を与え、次に' id(id 5) '。 –