Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell foldr用于列表_Haskell - Fatal编程技术网

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)。