TL; DR保存累加器,而不是“流”。
的强大的解决方案是通过@Dogbert在给予:StreamSplit
包似乎permorm正是有人问。为了历史的缘故,我的回答是:有许多Stream
函数(全部源自Stream.transform/4
,这是一个几乎可能需要的所有东西的通用流实现),可能会实现这个功能。例如,考虑斐波纳契数字。
stream = Stream.iterate({1, 1}, fn {acc, i} ->
{acc + i, acc}
end)
#⇒ #Function<61.36862645/2 in Stream.unfold/2>
stream |> Enum.take(5)
#⇒ [{1, 1}, {2, 1}, {3, 2}, {5, 3}, {8, 5}]
current = stream |> Enum.take(5) |> List.last
#⇒ {8, 5}
如果你想继续获取数字:
# ⇓⇓⇓⇓⇓⇓
Stream.iterate({8, 5}, fn {acc, i} ->
{acc + i, acc}
end)
只要保持在一个中间状态,并把它作为一个初始值码流功能使用的是得到的素数作为一个可能实现它们。我个人认为在保持“尾巴”而不是累加器方面有任何优势,但我可能肯定是错的。
这看起来像你想要的:https://github.com/tallakt/stream_split/blob/master/lib/stream_split.ex。我试着先用'Enumerable.reduce'实现类似的自己,但后来决定搜索现有的解决方案,因为它不是非常简单。 – Dogbert