9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 8

Elixirのチートシートを作ろう#5 enumその1

Last updated at Posted at 2024-12-07

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. 本日のチートシート

匿名変数の際に、作りますね。

9
1
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
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?