Haskell foldr用于列表

时间:2012-10-11 02:44:45

标签: haskell

给出以下示例

foldr(\ x y -> ........

如果输入是一个列表,例如[1,2,3]

什么是x,什么是y?

2 个答案:

答案 0 :(得分:5)

我们来看看foldr的类型。

foldr :: (a -> b -> b) -> b -> [a] -> b

由于您提供的功能使用xy,因此您可以从类型中看到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])

因此x1yfoldr (\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 [])))起。