書籍の第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]
この項続きます。。。