了解Elixir中的折叠

Bit*_*ise 2 elixir

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

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

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

我完全明白第二个arg是一个累加器.设置为0不应该返回10?

Dog*_*ert 5

累加器的初始值是0,你正在x - acc为列表中的每个x 做.评估如下:

x - acc = new_acc
-----------------
1 - 0   = 1
2 - 1   = 1
3 - 1   = 2
4 - 2   = 2
Run Code Online (Sandbox Code Playgroud)

acc - x如果你想x从初始累加器中减去每个,你可能想要这样做:

iex(1)> List.foldl([1, 2, 3, 4], 0, fn(x, acc) -> acc - x end)
-10
Run Code Online (Sandbox Code Playgroud)

这是我用来打印步骤的代码:

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
Run Code Online (Sandbox Code Playgroud)