恋すてふわが名はまだき立ちにけり人知れずこそ思ひそめしか
Advent Calendar 2022 92日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
Enum.product/1を楽しんでみます。
Enum.product/1
引数に指定された数値のEnumerableの各要素を掛け算してその答えを返してくれます。
Elixir 1.12 or laterで使用できます。
公式の説明をそのまま貼っておきます。
引数はEnumerableであればよいのでたとえばRangeもいけます。
iex> Enum.product(1..5)
120
iex> Enum.product(1..8//2)
105
空のリスト [] を指定した場合は1
です
iex> Enum.product([]) # (イ)
1
iex> Enum.product(100..1//1) # (ロ)
1
(イ)は公式ドキュメントにも書いてある例です。
(ロ)は、「first..last//step を楽しむ(Elixir)」で紹介したなんにもないRangeです。
おそらく下記の実装があるものと予想しました。
def product([]), do: 1
果たして、そんなものはありませんでした。
def product(enumerable) do
reduce(enumerable, 1, &*/2)
end
accumulatorの初期値に1
を指定して、reduce
が呼び出されていました。
&*/2
ははじめてみたときはぎょっとするとおもいます。
働きとしては fn v, acc -> v * acc end
とおなじです。
*をFunction capturingしているわけです。
[]
の中にある要素(実際にはない)をすべてかけ合わせると1
になるというのは、なんとなく神秘のようなものを感じます。
数学に疎くさっぱりわかりませんが、Elixirの実装がたまたまそうなっているだけなのか数学的に意味のあることなのかとても興味があります。
ご存知の方はぜひお便り(コメント)をください
Wrapping up
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
Enum.product/1を楽しみました。
以上です。