我正在尝试剖析并理解可枚举协议中的工作acc/0
原理。reducer/0
def map(enumerable, fun) do
reducer = fn x, acc -> {:cont, [fun.(x) | acc]} end
Enumerable.reduce(enumerable, {:cont, []}, reducer) |> elem(1) |> :lists.reverse()
end
有人可以从每个枚举中的 x、acc 的值开始解释这一点吗
我正在尝试剖析并理解可枚举协议中的工作acc/0
原理。reducer/0
def map(enumerable, fun) do
reducer = fn x, acc -> {:cont, [fun.(x) | acc]} end
Enumerable.reduce(enumerable, {:cont, []}, reducer) |> elem(1) |> :lists.reverse()
end
有人可以从每个枚举中的 x、acc 的值开始解释这一点吗
这几乎但不完全像其他函数式语言中的高级
Enum.reduce/3
和类似的“减少”或“折叠”操作。Enumerable
是一种低级 Elixir 协议(接口),类型可以实现它来表示它们是“容器”并且可以与函数一起使用Enum
;reduce
是核心构建块。该
reducer
参数将针对列表中的每个元素调用一次,并将累加器的上一个(或初始)值作为该参数。Enumerable:acc/0
累加器参数的类型不仅包括值,还包括一个控制原子,用于告诉Enumerable
实现要做什么,特别是带有提前停止的选项。:cont
这里的意思是“继续”,在这个例子中,您将始终遍历整个列表。假设你打电话
然后内部调用的顺序将是
其余的逻辑将
:cont
标记分离出来并反转列表,以使其处于正确的顺序。