我正在阅读elixir文档,我遇到了这段代码:
List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> x - acc end) # 2
我试了一会儿才明白它在做什么,但对于我的生活,我不明白为什么这会回来2?如果有人可以花时间向我解释这一点,我很感激。
我完全理解第二个arg是一个累加器。将其设置为0不应该返回10?
答案 0 :(得分:5)
累加器的初始值为0
,您为列表中的每个x执行x - acc
。评估如下:
x - acc = new_acc
-----------------
1 - 0 = 1
2 - 1 = 1
3 - 1 = 2
4 - 2 = 2
如果你想从初始累加器中减去每个acc - x
,你可能想要x
:
iex(1)> List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> acc - x end)
-10
这是我用来打印步骤的代码:
iex(1)> List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> IO.puts "#{x} - #{acc} = #{x - acc}"; x - acc end)
1 - 0 = 1
2 - 1 = 1
3 - 1 = 2
4 - 2 = 2
2
答案 1 :(得分:1)
让我们来看看你引用的确切行:
List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> x - acc end) # 2
在折叠期间,第三个参数中函数的返回值在每次迭代时分配给累加器:
acc starts as 0
x = 1 => acc becomes x - acc => acc = 1 - 0 = 1
x = 2 => acc becomes x - acc => acc = 2 - 1 = 1
x = 3 ... acc = 3 - 1 = 2
x = 4 ... acc = 4 - 2 = 2