2

给定以下示例

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

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

什么是x,什么是y?

4

2 回答 2

5

让我们看一下 的类型foldr

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

由于您提供了使用xand的函数y,因此您可以从类型中看到 x 将是列表 ( [1,2,3]) 中的值,并且 y 必须是累加器值,您使用第二个参数将其初始化为foldr

于 2012-10-11T02:47:52.630 回答
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[]zfoldr f z [a,b,c,d]f a (f b (f c (f d z)))[a,b,c,d](:) a ((:) b ((:) c ((:) d [])))

于 2012-10-11T07:03:12.730 回答