gpt4 book ai didi

Haskell 与 erlang : difference in foldl?

转载 作者:行者123 更新时间:2023-12-02 10:28:05 25 4
gpt4 key购买 nike

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

如何解释这种差异?

最佳答案

您因不简化折叠功能而感到困惑。

向左折叠,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

向左折叠,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

向右折叠,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

向右折叠,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 函数将被传递传递了(元素,累加器)。另一方面,Erlang 中的两个函数都将传递 (Element, Accumulator)

关于Haskell 与 erlang : difference in foldl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34238649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com