次の例を考えると
foldr(\ x y -> ........
入力がリストの場合、たとえば[1,2,3]
xとは何ですか?yとは何ですか?
のタイプを見てみましょうfoldr
。
foldr :: (a -> b -> b) -> b -> [a] -> b
x
とを使用する関数を提供しているのでy
、タイプからxがリスト([1,2,3]
)の値になり、yはアキュムレータ値である必要があります。これは2番目のパラメータで初期化されますfoldr
。
の定義foldr
は
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
あなたはそれをあなたの例に直接適用することができます:
foldr (\x y -> foo x y) z [1,2,3]
=
(\x y -> foo x y) 1 (foldr (\x y -> foo x y) z [2,3])
=
foo 1 (foldr (\x y -> foo x y) z [2,3])
そうx
です1
、そしてy
ですfoldr (\x y ...) z [2,3])
。
一般に、リスト内のすべてを、に、およびをfoldr f z
に置き換えると考えることができます。したがって= (=から。(:)
f
[]
z
foldr f z [a,b,c,d]
f a (f b (f c (f d z)))
[a,b,c,d]
(:) a ((:) b ((:) c ((:) d [])))