いろいろ発見メモ

さまざまな試行と実験と発見と調べ物のメモ書きです

Elixir の匿名関数 (1)

書籍の第5章より

Elixir は関数型言語なので、関数も一級市民として扱われます。

この章では以下のトピックを扱っています

匿名関数 (anonymous function)

匿名関数は fn 引数リスト -> 関数本体 end という記述で定義します。

# 引数に 1 を足す匿名関数を add1 という変数に代入してみる
iex> add1 = fn x -> x + 1 end
# 匿名関数の呼び出し(変数名のの後ろに '.' が必要)
iex> add1.(3)
4
# 二つの引数の差をとる匿名関数を定義して sub2 に代入
iex> sub2 = fn x, y -> x - y end 
#Function<12.90072148/2 in :erl_eval.expr/5>
iex> sub2.(10,3)
7
# 引数がなくても呼び出しにカッコは必要。単に 11 を返す匿名関数
iex> eleven = fn -> 11 end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex> eleven
#Function<20.90072148/0 in :erl_eval.expr/5>
iex> eleven.()
11

 関数とパターンマッチ

Elixir では代入は存在しません。

a = 1 と書かれたものも代入ではなく、パターンマッチです。この場合 a が 1 に束縛されます。

関数呼び出しでも同様に、実引数が仮引数にパターンマッチで束縛されます。

# 引数を3つの要素のリストにする

iex> make3 = fn a -> [a, a, a] end
#Function<6.90072148/1 in :erl_eval.expr/5>
iex> make3.(5)
[5, 5, 5]

演習問題

# ご注意。この先に演習問題(Your Turn)の解答を書きます

iex> list_concat = fn [e1,e2],[e3,e4] -> [e1,e2,e3,e4] end
#Function<12.90072148/2 in :erl_eval.expr/5>
iex> list_concat.([:a,:b],[:c,:d])
[:a, :b, :c, :d]

iex> sum = fn a,b,c -> a+b+c end
#Function<18.90072148/3 in :erl_eval.expr/5>
iex> sum.(1,2,3)
6

iex> pair_tuple_to_list = fn {a,b} -> [a,b] end
#Function<6.90072148/1 in :erl_eval.expr/5>
iex> pair_tuple_to_list.({1234,5678})
[1234, 5678]

 

この項続きます。。。