1. OverView
…Enumには、戦車道に必要な事が全部詰まってます、要するにチェスト。(薩摩ホグワーツ悩)
5日で、さくっと初級全部を終わらせる予定だったんですが、諦めました。
チートシートなんですが、ここ、コピペで終わらせると後悔しそうな気がする。誰が?俺がだ。
ぶっちゃけ、みなさん、ラムダ式とかでほかの言語で経験済みでしょ、とか思うんですが、くどくやります。
さて、ちょっと話が前後しますが、enumには、匿名関数(anonymous function)が使われます。
応用範囲もすっごく広がるのですが、これでサンプルコードがわかりにくくなってみます。
なので例によって、説明順を変更します。
訳が分からん文章が続きますが、例まで待ってください。
例みたら「くどいんだよ、馬鹿野郎」とお怒りになると思います。
2. まずは解説
他の言語でも出来るやい!みたいな議論は楽しいので、Xでやるとして、関数型プログラミングの
パラダイムでは、「関数の引数に関数を渡す」と言うことをやります。
Enumの関数によっては、関数を引数にとり、一定の条件で、コレクションから抽出した要素に対して
引数でとった関数で処理します。
…何を言ってるんだから日本語にするとわからんのですが、実際に見ると、簡単です。
まず、操作対象のコレクション(list型)を作成します。
testlist=[1,2,3,4]
...ハンガリー記法とかあったね、やらないよ。
さて、このtestlistの各要素に対して、関数を適用するEnumの関数を選びましょう。
map/2を使用します。
ヘルプを見てみましょう
iex(102)> h Enum.map/2
def map(enumerable, fun)
@spec map(t(), (element() -> any())) :: list()
Returns a list where each element is the result of invoking fun on each
corresponding element of enumerable.
For maps, the function expects a key-value tuple.
## Examples
iex> Enum.map([1, 2, 3], fn x -> x * 2 end)
[2, 4, 6]
iex> Enum.map([a: 1, b: 2], fn {k, v} -> {k, -v} end)
[a: -1, b: -2]
第二引数が
element() -> any()となってますが、これから、二つを解説しますわ。
以下の例では、第一引数に、上で定義したtestlist、第二引数に「匿名関数」fn x -> x * 2 endを
引き渡します。
iex(103)> Enum.map( testlist, fn x -> x * 2 end)
[2, 4, 6, 8]
testlistの各エレメントが、「匿名関数」 fn ~ endまでに引き渡されてます。
そう、fn x -> x * 2 endと言う関数自体が、Enum.mapに引き渡されて、毎回、呼び出されてます。
つまり、Enum.map関数が、testlistから、一個ずつ要素を取り出し、fn x -> x * 2 endに渡して
行き、処理させて、結果をlistで返します。
じゃ、引数をmapにしてみましょう。
iex(1)> testmap=%{c: 3, a: 1, d: 4, b: 2}
%{c: 3, a: 1, d: 4, b: 2}
iex(2)> Enum.map( testmap, fn({key, value}) -> {key, value} end)
[c: 3, a: 1, d: 4, b: 2]
iex(3)> Enum.map( testmap, fn({key, value}) -> {key, value + 5} end)
[c: 8, a: 6, d: 9, b: 7]
…mapがlistになってるのに注意してください。上に戻り値:: list()と書いてありますね。
3. 本日のチートシート
匿名変数の際に、作りますね。