了解Elixir中的折叠

时间:2017-06-20 19:29:52

标签: elixir

我正在阅读elixir文档,我遇到了这段代码:

List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> x - acc end) # 2

我试了一会儿才明白它在做什么,但对于我的生活,我不明白为什么这会回来2?如果有人可以花时间向我解释这一点,我很感激。

我完全理解第二个arg是一个累加器。将其设置为0不应该返回10?

2 个答案:

答案 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