🌽
Elixirの無名関数②:具体的な利用例 -- YouTube チャンネル daimon.ex 第6回解説
動画
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