次の例を考えると
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[]zfoldr f z [a,b,c,d]f a (f b (f c (f d z)))[a,b,c,d](:) a ((:) b ((:) c ((:) d [])))