【发布时间】:2015-12-12 21:58:43
【问题描述】:
我注意到在 foldl 方面,Haskell 和 Erlang 之间存在差异。
对于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
如何解释这种差异?
【问题讨论】:
-
foldl和foldr的第一个参数的参数顺序在 Haskell 中似乎不同:foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b和foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b。 -
2*x+yvsX+2*Y-- 这是故意的吗? -
@chi 很细心,原来我把这两个混在一起了!但是,问题仍然存在,只是现在完全不同了……
foldr的行为相同,但foldl返回的数字不同。 -
支持 Dogbert 的建议:Erlang
foldl(f,x,l)似乎等同于 Haskellfoldl (flip f) x l--f以不同的顺序接受参数。