プログラミングElixirを読んでいて、問題中に「アキュムレータ」という単語が出てきて意味がわからなかったので調べました。
その問題
以下がその問題です。
先ほど定義した
sum
関数では、その時々の合計を第二引数として引き回すようにした。これで、値を作るために、どのようにアキュムレータを使うか、分かりやすく見せることができた。ちなみに、sum
関数は、アキュームレータを使わずに書くこともできる。できるかな?やってみよう。
先ほど定義したsum
関数というのは、以下の関数です。
MyList.exs
defmodule MyList do
def sum([], total), do: total
def sum([ head | tail ], total), do: sum(tail, head+total)
end
アキュムレータとは何か?
アキュムレータは「状態を保持するために追加された引数」のことを言うそうです。今回はtotal
に値を入れています。
1..10 |> Enum.to_list |> MyList.sum(0) # 55
total
の値は0から始まって、順番に1、2、3...を足していっています。何をやっているかは分かるのですが、なんとなくtotal
はいらないような気がします。
アキュムレータを使わないで実装する
実際、sum
関数はアキュムレータなしで実装できます。
MyList.exs
defmodule MyList do
def sum([]), do: 0
def sum([ head | tail ]), do: head + sum(tail)
end
1..10 |> Enum.to_list |> MyList.sum # 55
すっきりしましたね!アキュムレータは便利そうですが、実装時には本当にいるかどうかよく考える必要がありそうです。