当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Enum.reduce用法及代码示例


Elixir语言中 Enum.reduce 相关用法介绍如下。

用法一

reduce(enumerable, fun)
@spec reduce(t(), (element(), acc() -> acc())) :: acc()

使用累加器为enumerable 中的每个元素调用fun

如果 enumerable 为空,则引发 Enum.EmptyError

enumerable 的第一个元素用作累加器的初始值。然后,使用下一个元素和累加器调用该函数。函数返回的结果递归地用作下一次迭代的累加器。 enumerable 完成后,返回最后一个累加器。

由于可枚举的第一个元素用作累加器的初始值,因此fun 只会执行n - 1 次,其中n 是可枚举的长度。此函数不会为 one-element 长的枚举调用指定的函数。

如果您希望对累加器使用其他值,请使用 Enum.reduce/3

例子

iex> Enum.reduce([1, 2, 3, 4], fn x, acc -> x * acc end)
24

用法二

reduce(enumerable, acc, fun)
@spec reduce(t(), acc(), (element(), acc() -> acc())) :: acc()

使用累加器为enumerable 中的每个元素调用fun

累加器的初始值为 acc 。使用累加器为可枚举中的每个元素调用该函数。函数返回的结果作为下一次迭代的累加器。该函数返回最后一个累加器。

例子

iex> Enum.reduce([1, 2, 3], 0, fn x, acc -> x + acc end)
6

减少作为构建块

Reduce(有时称为 fold )是函数式编程的基本构建块。 Enum 模块中几乎所有的函数都可以在reduce之上实现。这些函数通常依赖于由运行时优化的其他操作,例如 Enum.reverse/1

例如,我们可以用 reduce/3 来实现 map/2 ,如下所示:

def my_map(enumerable, fun) do
  enumerable
  |> Enum.reduce([], fn x, acc -> [fun.(x) | acc] end)
  |> Enum.reverse()
end

在上面的示例中, Enum.reduce/3 将每次调用 fun 的结果以相反的顺序累积到一个列表中,最后通过调用 Enum.reverse/1 正确排序。

实现 map/2 filter/2 等函数是理解 Enum.reduce/3 背后力量的一个很好的练习。当 Enum 模块中的任何函数都无法表达操作时,开发人员很可能会求助于 reduce/3

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Enum.reduce(enumerable, fun)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。