LoginSignup
12
2

More than 1 year has passed since last update.

恋すてふわが名はまだき立ちにけり人知れずこそ思ひそめしか


Advent Calendar 2022 92日目1の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:

Enum.product/1を楽しんでみます。

Enum.product/1

引数に指定された数値のEnumerableの各要素を掛け算してその答えを返してくれます。
Elixir 1.12 or laterで使用できます。

公式の説明をそのまま貼っておきます。

スクリーンショット 2022-04-10 19.15.37.png

引数は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の実装がたまたまそうなっているだけなのか数学的に意味のあることなのかとても興味があります。

ご存知の方はぜひお便り(コメント)をください :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:


Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir:bangbang::bangbang::bangbang:
$\huge{Enjoy\ Elixir🚀}$

Enum.product/1を楽しみました。

以上です。

  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2