elixir - 理解 Elixir 中的折叠

标签 elixir

我在浏览 elixir 文档时发现了这段代码:

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

我尝试了一段时间来了解它在做什么,但我一直不明白为什么会返回 2?如果有人能花时间向我解释这一点,我将不胜感激。

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

最佳答案

累加器的初始值为 0,您正在为列表中的每个 x 执行 x - acc。评估如下:

x - acc = new_acc
-----------------
1 - 0   = 1
2 - 1   = 1
3 - 1   = 2
4 - 2   = 2

如果您想从初始累加器中减去每个 x,您可能打算执行 acc - 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

关于elixir - 理解 Elixir 中的折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44661547/

相关文章:

environment-variables - Distillery 不替换环境变量

elixir - 为什么运行 local.phx 会降级 phoenix 存档?

elixir - 重写 Logger 以在输出中添加 __MODULE__

architecture - BEAM 在 elixir 编程语言的 iex 中代表什么?

缺少Elixir 1.3.0 : String. strip/1和String.strip/2 API文档。

macos - brew链接错误libpng和libtiff

elixir - 在资源路由中添加新路径

elixir - 加入 Phoenix Channel(或其他 pubsub)时同步应用程序状态

elixir - 添加一个唯一字段并填充它

tcp - 在 Elixir 中设置 gen_tcp 的参数