我想编写一个类似于 List.concat/1 的函数,它接受一个可枚举的列表并将连接的列表作为连续流发出。
它会像这样工作:
iex> 1..3 |> Stream.map(&([&1])) |> Enum.to_list
[[1], [2], [3]]
iex> 1..3 |> Stream.map(&([&1])) |> MyStream.concat |> Enum.to_list
[1, 2, 3]
到目前为止,我想出的是:
defmodule MyStream do
def concat(lists) do
Enumerable.reduce(lists, [], fn(x, acc) -> acc ++ x end)
end
end
这会产生正确的结果,但显然不是懒惰的。
我没有成功尝试使用Stream.Lazy
,但真的无法理解它的内部工作原理。任何解释Stream.Lazy
将不胜感激!