我遇到了问题。这两个功能有什么区别:
foldl (\x y -> x*2 + y*2) 0 [1,2,3] = 22
foldr (\x y -> x*2 + y*2) 0 [1,2,3] = 34
foldl (\x y -> x*2 + y*2) 0 [1,2,3] ⇒ f( f( f(0,1),2 ),3 )
foldr (\x y -> x*2 + y*2) 0 [1,2,3] ⇒ f( 3,f( 2, f(1,0) ) )
在哪里f = \x y -> x*2 + y*2
。
我了解以下结果foldl
:
x = f(0,1) = 2
y = f(x,2) = 8
z = f(y,3) = 22
但是为什么要foldr
在每个步骤的结果之后求和呢?
2 + 8 + 22 = 34
您的foldr
评估落后了。它看起来应该像这样:
foldr f 0 [1,2,3] == f 1 (f 2 (f 3 0))
相比之下,foldl
评估(在您的问题中是正确的)看起来像
foldl f 0 [1,2,3] == f (f (f 0 1) 2) 3
如果您认为列表[1,2,3]
与相同1:2:3:[]
,可以放心地使用以下图表foldr
:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句