$\huge{元氣ですかーーーーッ!!!}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
本日は、Enum.reduce/3を説明します。
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
Enum.reduce/3
専門用語で言うと、「畳込み」です。
専門家っぽくなりたいだけなら「reduce、あっ畳込みね」と言っておけばいいです。
専門家になりたければその意味することをしっかりと理解する必要があります。
「関数型の鬼門です」と脅しをいれながら、 元氣があればなんでもできる! です。
向上の意気、天を衝くのであります。
Enumerableなものの要素ひとつひとつに関数を適用して、ある形にまとめて行きます。
「Enumerableなもの」がはてな? の方は、「闘魂Elixir ── 06. Enumモジュール」を振り返ってくださいませ。
言葉にするとなんだか難しいかもしれませんが、こちらの図をみてください。
上図の説明をします。1
なかなか複雑ですね。絵が小さいしごちゃごちゃしていますね。ダウンロードして拡大して見てみてください。
[:cat, :dog, :dog, :dog, :cat, :bird]
がInputです。
結論を先にいうと、リストの中に含まれているアトムの数を数え上げています。
要素1個ずつに関数f
を適用しています。acc
の初期値は、空のMap%{}
です。
関数f
の実行結果は、次の要素に関数f
を適用するときのacc
となります。
Map.update/4は、第1引数のMapを更新する関数です。第1引数がMapで、第2引数がキー、第3引数が値です。もしキーがすでにMapに含まれている場合には、第4引数に指定した関数に従って値を更新します。この関数の引数は、現在の値です。fn cnt -> cnt + 1 end
としておりますので、カウントアップしているわけです。
どうでしょうか、伝わりましたでしょうか。
Enum.reduce/3は、Elixirを一人前になるときに避けては通れない関数です。
IExで確かめてみましょう。
iex
IExが立ち上がったら、以下のプログラムを実行してみてください。
iex> f = fn v, acc -> Map.update(acc, v, 1, fn cnt -> cnt + 1 end) end
iex> Enum.reduce([:cat, :dog, :dog, :dog, :cat, :bird], %{}, f)
%{bird: 1, cat: 2, dog: 3}
[:cat, :dog, :dog, :dog, :cat, :bird]
=> %{bird: 1, cat: 2, dog: 3}
の変換ができました
ワンポイントレッスン
f
関数は使わなくても以下のように書くことができます。
Enum.reduce([:cat, :dog, :dog, :dog, :cat, :bird], %{}, fn v, acc -> Map.update(acc, v, 1, & &1 + 1) end)
また、今回の例はEnum.frequencies/1を使うと同じことができます。
Enum.frequencies([:cat, :dog, :dog, :dog, :cat, :bird])
%{bird: 1, cat: 2, dog: 3}
今日の闘魂
今日は、『孟子』から言葉を引きます。
浩然之氣
解説は、こちらをご参照ください。
猪木さん流に言うと、「すべては、砂漠に遺した足跡。風が吹いたら消え去るだけーー」ということです。
『アントニオ猪木自伝』から引きました。
猪木さんを裏切った相手を躊躇なくリングに上げました。
でっかい心ですべてを包み込みましょう。宇宙から眺めてみましょう。たいていの人間関係はちっぽけなものです。
わたしは、すべての過去を根に持たないからだ。
(中略)過去を捨て去る勇気も人生においては大切なのだ。
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「元氣」をもらってください。
さいごに
Enum.reduce/3を説明しました。
闘魂の意味は、 「己に打ち克ち、闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
$\huge{1、2、3 ぁっダー!}$
Elixir Advent Calendar 3の9日目は、毎度お馴染み @torifukukaiou さんから、今回は関数型の鬼門である「畳込み」関数のElixirバージョン、Enum .reduceです😜https://t.co/TLcJwLnOJw
— piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) December 9, 2022
「畳込み」は、言葉にするとなんだか難しいかも知れませんが、Elixirで一人前になるとき避けては通れない関数😌 pic.twitter.com/sV39TKe4IU
$\huge{元氣があればなんでもできる!}$
-
図は、https://excalidraw.com/ を使って作成しています。スゴ腕ハッカーが書いたかのような手書き風の絵が書けるので最近の私のお気に入りツールです。 ↩