Elixir Stream.unfold建立新状态

时间:2017-09-16 15:32:10

标签: elixir

以下是使用Stream.unfold显示带有灵药的斐波纳契序列的示例。

Stream.unfold({0,1}, fn {f1,f2} -> {f1, {f2, f1+f2}} end) |> Enum.take(15)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

为什么需要在f1中提供{f1, {f2, f1+f2}},而不仅仅是{f2, f1+f2}

因为在上面的代码解释中说:

  

新状态向下移动一个序列,因此初始状态为   {f1,f2}成为{f2,f1 + f2}的新状态。

1 个答案:

答案 0 :(得分:3)

这是因为f1是流应该由消费者产生的值,而{f2, f1 + f2}状态展开操作需要下一个迭代。生成斐波纳契数需要在状态中使用2个值。

如果您正在生成自然数,则可以使用2个整数的元组:

iex(1)> Stream.unfold(0, fn x -> {x, x + 1} end) |> Enum.take(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]