Elixir 中的枚举通过约简函数表示。只要您告诉我们如何减少它,我们就可以映射任何结构。
Stream 的整体思想是您可以组合这些归约函数。我们以地图为例:
def map(enumerable, f) do
Lazy[enumerable: enumerable,
fun: fn(f1) ->
fn(entry, acc) ->
f1.(f.(entry), acc)
end
end]
end
您收到一个可枚举的值,并且希望使用该函数映射每个元素f
。惰性版本接收实际的归约函数f1
并返回一个新函数,该函数接收entry
and acc
(同样的论点f1
会收到)然后打电话f.(entry)
在调用之前有效映射元素f1
(减少函数)。请注意我们如何逐一映射元素。
其平面地图变体可能类似于:
def flat_map(enumerable, f) do
Lazy[enumerable: enumerable,
fun: fn(f1) ->
fn(entry, acc) ->
Enumerable.reduce(f.(entry), acc, f1)
end
end]
end
现在,每次你打电话f.(entry)
,您得到一个列表,并且您想要迭代这个新列表的每个元素,而不是迭代整个列表。
我还没有尝试过上面的代码(我可能错过了一些细节),但这就是 Streams 的一般工作方式。