Edited at

Elixir~Enumと&記法、パイプライン演算子

※さらに編集後記追加しました!

Elixir完全初学、四則演算をEnum.map、filterに絞って記法を覚えたいド素人によるドキュメントです。


いままでわからなかったこと

パイプライン演算子?Enum?触ってはいるけど実際に自分で考えて全く書けない!赤子のようだ!

そんなことを思っていた過去の自分に向けて、記事を書いてみます。

同じことで悩んでいる方の助けになればと思います。


本題

ここにEnum.mapのコードがあります。

第一引数のリストに2をかけろという内容です。

iex>Enum.map([1, 2, 3], fn x -> x * 2 end)

[2, 4, 6]

まずは第一引数の[1, 2, 3]はそのままに、fn~ endの部分を&記法で書き換えていきます。

iex>Enum.map([1, 2, 3], & &1 * 2)

[2, 4, 6]

さらに、パイプライン演算子を用いて、第一引数の「1, 2, 3」を行頭に持ってきます。

iex>[1, 2, 3] |> Enum.map(& &1 * 2)

[2, 4, 6]

最後のパイプライン演算子と&記法を用いたものがかなり簡潔だと思います。

同様に、Enum.filterでも同じ試みをします。

3で割って余りがゼロになるものをリストしろという内容です。

iex>Enum.filter([3, 5, 9], fn x -> rem(x, 3) == 0 end)

[3, 9]

こちらも第一関数のリストはそのままに、fn~endを&記法で書き換えます。

iex>Enum.filter([3, 5, 9], & rem(&1, 3) == 0)

[3, 9]

さらに、パイプライン演算子を用いて第一引数のリストを先頭に持ってきた記法です。

やはりこれが一番スマートでしっくりきます。

iex>[3, 5, 9] |> Enum.filter(& rem(&1, 3) == 0 )

[3, 9]

こんな感じで、引数や乗数、除数の条件を変えて何パターンか計算してエディタに記録したのが、以下のスクリーンショットです。こうしてEnumに特化した記法を叩き込んでいこうと思います。

スクリーンショット 2019-02-12 16.48.03.png


まとめ

例えば、下記のようなfn~endの第二引数を用いたEnum.mapおよびfilterの記述

iex>Enum.map([1, 2, 3], fn x -> x * 2 end)

[2, 4, 6]

を、&記法と、パイプライン演算子によって、次のように左辺に第一引数を集めつつ簡潔なものにすることができた!

iex>[1, 2, 3] |> Enum.map(& &1 * 2)

[2, 4, 6]

このパイプライン演算子が極私的には強烈なもので、第一引数のリストをまるっと左辺にブチ込んでしまえる!簡潔!これでプログラムが読みやすい!

、、、と思いました。


編集後記、困ったこと

Enum.sortに関して、

[323,999,54] |> Enum.filter(fn(n) -> n!= 999 end)

[323,999,54] |> Enum.filter(& &1 != 999)

の書き換えをここまでの知識で導き出すことができた!やった!

・純然な用語の理解

引数ってJavaでやったけど関数とごっちゃになっててこれは関数?第二引数?若干書き方をボカしてしまったぞ?

・パイプライン演算子

これは==とかの演算子と同じで第一引数は左辺にある、と言い切っていいのか?そこも曖昧にしてしまったな。。

コメントなどで解決の御指南あればお願いいたします!