Haskell 函数 foldl (\xy -> x*2 + y*2) 0 行为

Vic*_*nko 1 haskell fold

我遇到了一个问题。这两个函数有什么区别:

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)

Dav*_*vid 5

你有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可能会有所帮助:

文件夹图