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
以上です。