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