2015-12-12 57 views
8

我注意到有Haskell和当谈到foldl二郎之间的差异。Haskell与erlang:foldl的区别?

对于foldr,两种语言返回相同的结果:

foldr (\x y -> 2*x+y) 4 [1, 2, 3] -- returns 49 
lists:foldr(fun(X, Y) −> X+2∗Y end, 4, [1,2,3]). % returns 49 

foldl的返回值是不同的:

foldl (\x y -> x+2*y) 4 [1, 2, 3] -- returns 16 
lists:foldl(fun(X, Y) −> X+2∗Y end, 4, [1,2,3]). -- returns 43 

这怎么差别来解释?

+3

的参数foldl'的'的第一个参数的顺序和'fol​​dr'似乎是在Haskell不同:'与foldl ::可折叠吨=>(B - >一 - > B) - >乙 - > TA - > b'和'fol​​dr ::可折叠t =>(a→b→b)→b→ta→b'。 – Dogbert

+1

'2 * X + y' VS'X + 2 * Y' - 的是,意图? – chi

+0

@chi非常仔细,事实证明我混合了这两个!然而,问题依然存在,只不过它现在正好相反......'foldr'表现相同,但foldl'返回一个不同的数字。 –

回答

13

你被不简化您的折叠功能混淆自己。

倍左,Haskell中:左

Prelude Debug.Trace> foldl (\x y -> trace("x:"++show x++" y:"++show y) $ x+y) 4 [1,2,3] 
x:4 y:1 
x:5 y:2 
x:7 y:3 
10 

倍,二郎

1> lists:foldl(fun (X,Y) -> io:format("x:~p y:~p~n", [X,Y]), X+Y end, 4, [1,2,3]). 
x:1 y:4 
x:2 y:5 
x:3 y:7 
10 

倍右,Haskell中

Prelude Debug.Trace> foldr (\x y -> trace("x:"++show x++" y:"++show y) $ x+y) 4 [1,2,3] 
x:3 y:4 
x:2 y:7 
x:1 y:9 
10 

倍权,二郎

2> lists:foldr(fun (X,Y) -> io:format("x:~p y:~p~n", [X,Y]), X+Y end, 4, [1,2,3]). 
x:3 y:4 
x:2 y:7 
x:1 y:9 
10 

由此看来,很明显,在Haskell中,foldl会被传递给(Accumulator, Element)foldr会被传递给(Element, Accumulator)。另一方面,Erlang中的这两个函数都将通过(Element, Accumulator)