【发布时间】:2016-02-21 11:17:50
【问题描述】:
我正在尝试了解灵药流。
首先,我有一个列表,它遍历一个范围和多个 2。
iex(5)> stream = 1..3 |>
...(5)> Enum.map(&IO.inspect(&1)) |>
...(5)> Enum.map(&(&1 * 2)) |>
...(5)> Enum.map(&IO.inspect(&1)) |>
...(5)> Enum.reduce(4, &+/2)
1
2
3
2
4
6
16
这里一切都清楚了,每个枚举都返回一个列表以进一步处理该列表。它为列表中的每个元素迭代四次。
让我们用流构建它:
iex(4)> stream = 1..3 |>
...(4)> Stream.map(&IO.inspect(&1)) |>
...(4)> Stream.map(&(&1 * 2)) |>
...(4)> Stream.map(&IO.inspect(&1)) |>
...(4)> Enum.reduce(4, &+/2)
1
2
2
4
3
6
16
这里它只对范围内的每个数字进行一次迭代,这与上面的 enum 示例不同。我不明白的是,当 Enum.reduce 的累加器只迭代一次时,它如何保持值并由他们自己进行递归调用?
当我按如下方式迭代枚举时:
iex(25)> f = fn(x, y) ->
...(25)> IO.puts(y)
...(25)> x + y
...(25)> end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex(26)> iter = 1..5 |> Enum.reduce(4, f)
4
5
7
10
14
19
然后我可以想象,enum.reduce 如何将累加器传递给下一个递归调用。
但是,如果流的迭代只执行一次,流如何通过累加器进行下一次递归调用?
【问题讨论】:
-
你的问题很困惑——没那么复杂的看elixir-lang.org/getting-started/enumerables-and-streams.html
-
你可以去 GitHub 中的 Elixir 语言看看源代码,虽然它可能是来自 Erlang 的映射。
标签: elixir