我遇到了一个问题。这两个函数有什么区别:
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) ) )
Run Code Online (Sandbox Code Playgroud)
在哪里 f = \x y -> x*2 + y*2。
我理解的结果foldl:
x = f(0,1) = 2
y = f(x,2) = 8
z = f(y,3) = 22
Run Code Online (Sandbox Code Playgroud)
但是为什么要foldr在每一步的结果之后求和呢?
2 + 8 + 22 = 34
Run Code Online (Sandbox Code Playgroud)
你有foldr反向评估。它应该是这样的:
foldr f 0 [1,2,3] == f 1 (f 2 (f 3 0))
Run Code Online (Sandbox Code Playgroud)
相比之下,foldl评估(在您的问题中是正确的)看起来像
foldl f 0 [1,2,3] == f (f (f 0 1) 2) 3
Run Code Online (Sandbox Code Playgroud)
如果您认为该列表[1,2,3]与 相同1:2:3:[],则此图foldr可能会有所帮助:

| 归档时间: |
|
| 查看次数: |
533 次 |
| 最近记录: |