この記事は「Elixir Advent Calendar 2023」13日目の記事です
東京にいるけどfukuokaexのYOSUKEです。
普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。
このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習 というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ!というノリで書いてみたいと思います。
なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第13回目です。
それでは、いくぞ!
funの正体
よーし、貴様ら! 今日は、Enum.map(list,& &1)
前回扱った、この関数の2つ目に入れてる値、&
を使ったと思うが、この&を使った部分について説明しょう。
リファレンスを見ると、fun
と書かれている場所だ。
これは、functionの略だ要するに関数を入れていたんだ。関数は、便利な道具として貴様らは既にいくつか使っていたな。
例えば、Tuple.to_list()
などだ。
Enum.map(enumerable, fun)
の最初のenumerable
にはリストを入れろと前回伝えた通りだが、fun
の部分に、貴様らが既に使ったTuple.to_list()
を入れて使って見るとどうなるか見せてやろう。
Enum.map([{1,2}, {3,4}], &Tuple.to_list(&1))
[[1,2],[3,4]]
ここで前回、貴様らに教えた&
と&1
が出てきたな。この&
は実は&
の次に続く部分を関数化してくれる便利な道具だ。そして、&1
で表記している箇所が関数に渡す値
を入れてほしい場所を表している。
この関数とは何か?、色々な機能の総称だ。部隊に例えるなら、貴様らは自衛隊だと言ってるようなものだ、しかし、我々は部隊毎に職種が違う、例えば、陸上自衛隊では、普通科や、戦車連隊、特科連隊、高射特科連隊、偵察隊、施設大隊、通信大隊、飛行機・ヘリコプター隊、特殊武器防護・化学防護隊、後方支援連隊、対舟艦対戦車中隊など
このように最初から準備された関数はそれぞれの部隊に配属されているものがある。Tuple.to_list()
の場合なら、Tuple
隊にいるようなもの。このTuple
などの自衛隊の各部隊に当たる部分をモジュール
という。
そして、各部隊(モジュール
)で予め決められた、任務を果たす機能を定義されている。
貴様らが、ここまで使ったモジュールは、Tuple
やEnum
といったモジュールから、必要な機能を使ったが
部隊に例えると、通信に関する機能を持つ、通信隊などもあるだろうが、普通科の中でも一部、通信を担う仕事が発生したりする。また、特殊な機能を持っているわけではないが、ちょっとだけ通信に関する任務をしなければならい事も出てくるだろう。
そのようにちょっとだけ、普通科の隊員に仕事をさせるような時の命令が&
の役割のようなものだ。
例えば、tanaka
に 数字を渡したら、2倍にする仕事をやらせたいとする。その時にtanakへ命令する方法は以下になる
tanaka = & &1*2
これで、tanakaに 2を渡すと4を返すようになる。その時の命令の仕方は以下の通りだ。
tanaka.(2)
4
次にsuzukiには、 数字を渡したら、-1する仕事を命令したとする。
suzuki = & &1-1
これで、suzukiに数字を渡したら-1して返ってくる
suzuki.(4)
3
いいか、貴様ら &
の正体は、&
より右側の仕事をさせるための命令だ。&1
はその仕事をするために必要な値を渡してるに過ぎない。そして、ちょっとした命令はtanaka
やsuzuki
などにやらせることができるように変数
にパターンマッチさせて使うことができる。
何? 理屈がわからないだと? 貴様らに理屈はまだ早い! これは命令だ。命令の仕方と使い方だけ覚えれば良い!
理屈は後だ! 貴様らは言わば入りたての2等兵だ、それが連隊長と同じ戦略を考えられると思うのか!
身の程をわきまえろ! まずは、命令に従え!分かったな!
- はい!
よーし、それでは今回はここまでだ、次回はtanaka
とsuzuki
が協力して仕事をする方法を教えよう。そして、 &Tuple.to_list(&1)
この書き方をもう少し紐解いていく。
今日はここまで、それでは次回 Part14でまた会おう!