🌽

Elixirの無名関数②:具体的な利用例 -- YouTube チャンネル daimon.ex 第6回解説

2024/05/21に公開

動画

https://www.youtube.com/watch?v=bt-8roq3iMg

No.6「Elixir の 無名関数②:具体的な利用例」

Elixir の 無名関数①:基礎知識の続きです。

関数 Enum.map/2 で無名関数を使う

動画の後半(ライブコーディング)では、次のコードを紹介しました。

numbers = [2, 11, -4]
result = Enum.map(numbers, fn n -> n + 1 end)
IO.inspect(result)

これを実行すると 3, 12, -3 という結果が表示されます。

コードの2行目にある fn n -> n + 1 が無名関数です。関数 Enum.map/2 は、第2引数に無名関数を取ります。

第1引数にリストが指定された場合、リストの各要素を無名関数に渡し、その結果から新たにリストを作って返します。

ライブコーディングで私は上記のコードを次のように書き換えました。

numbers = [2, 11, -4]
inc = fn n -> n + 1 end
result = Enum.map(numbers, inc)
IO.inspect(result)

変数 inc に無名関数をセットしておいて、それを関数 Enum.map/2 の第2引数に指定しています。

動画でも話しましたが、この書き換え自体に意味はありません。書き換え前の方がシンプルでわかりやすいです。しかし、こういう風に書けるということを知っておくと、いつか役に立ちます。

【参考】他の言語における実装例

参考までに直前に紹介したコードと同等のものを他の言語で記述してみます。

JavaScript

numbers = [2, 11, -4]
inc = n => n + 1
result = numbers.map(inc)
console.log(result)

Python

numbers = [2, 11, -4]
inc = lambda n: n + 1
result = list(map(inc, numbers))
print(result)

Python の map 関数は、Elixir の関数 Enum.map/2 と異なり、第1引数に無名関数(ラムダ式)を取ります。また、戻り値はリストではなく map 型オブジェクトとなります。これをリストに変換するには list 関数を使用します。

Ruby

numbers = [2, 11, -4]
inc = ->(n) { n + 1 }
result = numbers.map(&inc)
p(result)

Discussion