当前位置:  开发笔记 > 编程语言 > 正文

Haskell vs. erlang:foldl的区别?

如何解决《Haskellvs.erlang:foldl的区别?》经验,为你挑选了1个好方法。

我注意到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

如何解释这种差异?



1> Nathaniel Wa..:

你不会因为不简化你的折叠功能而让自己感到困惑.

向左折,哈斯克尔:

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

弃左,Erlang:

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

向右折,哈斯克尔:

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

向右折,Erlang:

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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有