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