7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Elixirの無名関数メモ

Last updated at Posted at 2018-09-22

 Elixirの無名関数(Anonymous function または lambda)についての備忘録です。どの言語もそうですが、Elixirも覚えにくいシンタックスがあります。今回取り上げるのは無名関数です。

#1.無名関数呼び出しにはdotを付ける!

 以下は無名関数の定義ですが、fnとendの間に関数本体を定義し、それをdoubleという変数で受けています。

無名関数の定義
iex(1)> double = fn x ->
...(1)>   2*x
...(1)> end
#Function<6.99386804/1 in :erl_eval.expr/5>

 以下が無名関数の呼び出しですが、doubleで呼び出すのではなく、double. で呼び出します。変数名の最後にdotを付けます。

無名関数の呼び出し
iex(2)> double.(3)
6

 ちなみに dot なしで double で呼び出すと、以下のようにエラーになります。dot無しで呼び出すと、Elixirはdoubleを無名関数ではなく、通常の名前付き関数と解釈して、その定義を探すようです。その結果、undefined function エラーとなります。

名前付き関数の呼び出し
iex(3)> double(4)
** (CompileError) iex:3: undefined function double/1

#2.無名関数の短縮定義 - & operator

 以下は無名関数の普通の定義です。

普通の定義
iex(3)> sum3 = fn x1, x2, x3 -> x1 + x2 + x3 end
#Function<18.99386804/3 in :erl_eval.expr/5>
iex(4)> sum3.(1,2,3)
6

 & operatorを使うと以下のように短い定義が可能です。

短縮定義
iex(5)> sum3 = &(&1 + &2 + &3)
#Function<18.99386804/3 in :erl_eval.expr/5>
iex(6)> sum3.(4,5,6)
15

 もう一つサンプルを示します。

短縮定義2
iex(9)> hello = &IO.puts("Hello " <> &1)
#Function<6.99386804/1 in :erl_eval.expr/5>
iex(10)> hello.("Taro")
Hello Taro
:ok

以上です。

7
2
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
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?