LoginSignup
5
3

More than 3 years have passed since last update.

Elixirの関数の省略は面白い

Posted at

※冒頭いきなりですが、Elixirに限らずな話かと思います、すんません。

初見ゴロシな式に出会った

インターネッツでelixirについて色々調べていたら、下記のコードに出会いました。

この処理が↓

Enum.reduce([1, 2, 3], fn(a, b) -> a + b end)

最終的にこう書ける↓

Enum.reduce(1..3, &+/2)

え、、、?
初見殺しな感じがすごい、、、
というか、僕は初見で死んだ、、、
ので、一歩ずつ噛み砕いてみました。

[1, 2, 3]は1..3という書き方ができる

rangeという書き方です。
これは、見ればなんとなくわかると思います。
直接書いてみるとわかるのですが、単純にリストが返ってくるわけではなさそうです。

iex(21)> [1,2,3]
[1, 2, 3]
iex(22)> 1..3   
1..3 #[1, 2, 3]のリストになるわけではない

fn(a, b) -> a + b endは&+/2という書き方ができる

匿名関数という書き方です。
&を使うことで、関数の記述量を省略することができます。

iex(24)> x = fn(a,b) -> a + b end
#Function<13.91303403/2 in :erl_eval.expr/5>
iex(25)> x.(1,2)
3
iex(26)> y = &(&1 + &2)
&:erlang.+/2
iex(27)> y.(1,2) 
3

ここからさらに、&1と&2を省略できるようでした。
「+」は引数を2つもつ関数(+/2)と表現するようです。(関数という表現の仕方であってるか...?)

iex(26)> y = &(&1 + &2)
&:erlang.+/2
iex(27)> y.(1,2) 
3
iex(28)> z = &(+/2)
&:erlang.+/2
iex(29)> z.(1,2)
3

さらに()も省略すると、

iex(28)> z = &(+/2)
&:erlang.+/2
iex(29)> z.(1,2)
3
iex(30)> zz = &+/2
&:erlang.+/2
iex(31)> zz.(1,2)
3

最初に出てきた式になりましたね。

まとめ

いかがでしたでしょうか?
初見のナニコレ感はすごいですが、ちゃんと調べるとほほーとなりました。
elixirはまだまだわからないことだらけですが、こうやって噛み砕いて少しづつ進んでいくのは、とても楽しい時間ですね。

5
3
2

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
5
3