Haskell foldr用于列表
给出下面的例子Haskell foldr用于列表,haskell,Haskell,给出下面的例子 foldr(\ x y -> ........ 如果输入是一个列表,例如[1,2,3] 什么是x,什么是y?让我们看看foldr的类型 foldr :: (a -> b -> b) -> b -> [a] -> b 由于您提供的函数使用了x和y,因此从类型中可以看出x将是列表中的一个值([1,2,3]),y必须是累加器值,您可以使用foldr的第二个参数初始化该值 foldr :: (a -> b -> b) -> b -
foldr(\ x y -> ........
如果输入是一个列表,例如[1,2,3]
什么是x,什么是y?让我们看看
foldr
的类型
foldr :: (a -> b -> b) -> b -> [a] -> b
由于您提供的函数使用了
x
和y
,因此从类型中可以看出x将是列表中的一个值([1,2,3]
),y必须是累加器值,您可以使用foldr的第二个参数初始化该值
foldr :: (a -> b -> b) -> b -> [a] -> b
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 fz[a,b,c,d]
=fa(fb(fc(fdz)))
(因为[a,b,c,d]
(:)a((:)b((:)c((:)d[])
让结果::b;结果=foldr(\(x::a)->\(y::b)->未定义的::b)(未定义的::b)([1,2,3]:[a]))
可能需要指出的是,这是foldr的功能定义,不一定是以这种方式实现的。是的,但是这个定义(来自报告)足够推理foldr
的语义了。我知道几个月后回答一个问题有点奇怪。但是foldr不是从右边开始折叠吗?第一步不是f3z吗?@NobWong:没有这样的“第一步”,但有一个最外层的redex,它涉及最左边的元素。“右折叠”中的“右”是这意味着它是从右边关联的,因此foldr(*)z[a,b,c]
是a*(b*(c*z))
——请注意,第一个(最左边)元素的乘法是最外层的。我建议查看定义并手动计算一些foldr
s(和foldl
s)。