bir örnek sağlar? foldr
yalnızca üç bağımsız değişken alır - ancak burada dört geçirilir: step
, id
, xs
, z
. (Toplamı birini bekler çünkü)İşlev, üç yerine dört argüman alıyor - neden bu ara vermiyor?</p> <pre><code>myFoldl f z xs = foldr step id xs z where step x g a = g (f a x) </code></pre> <p>Sorum şu: Neden bu kod derliyor sayfa 95 yazar "Gerçek Dünya Haskell", Okuma
Örneğin, bu işe yaramazsa:
sum filter odd [1,2,3]
yerine ben yazmak gerekir:
sum $ filter odd [1,2,3]
Neden "id id 5" yapabileceğinizi anlamıyorum ama yapamazsınız: foo x = x + 1; bar y = y + 1; foo çubuğu 1'? – drozzy
@drozzy - her şey tip ve polimorfizm ile ilgili. 'Id :: a -> a' seçeneğini seçin: * a için herhangi bir * tipini kullanabilirsiniz. Ancak, foo 'farklıdır, çünkü kısıtları vardır: bir sayıya ihtiyaç duyar: foo :: (Num a) => a -> a'. bar :: (Num a) => a -> a ',' Num' tipinin bir örneği değildir ve bu nedenle '(Num a)' foo'nun kısıtlamasını karşılamaz. –
@drozzy Belki de fonksiyon uygulamasının çağrışımını açıklığa kavuşturursak yardımcı oluruz! Unutmayın ki, id id '5' (id id) 5' olarak - yani, 'id' ilk önce 'id' argümanı olarak, sonra '5' sonuca bir argüman olarak - ' id (id 5). –