给定以下示例
foldr(\ x y -> ........
如果输入是一个列表,例如 [1,2,3]
什么是x,什么是y?
让我们看一下 的类型foldr
。
foldr :: (a -> b -> b) -> b -> [a] -> b
由于您提供了使用x
and的函数y
,因此您可以从类型中看到 x 将是列表 ( [1,2,3]
) 中的值,并且 y 必须是累加器值,您使用第二个参数将其初始化为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 [])))