當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。