funは無名関数のことです。
無名関数が何かというと、名前がない関数と言えます。
実際に無名関数がいったいどういうものなのかを見てみましょう。
1> Fun = fun(X) -> X * 2 end.
#Fun<erl_eval.6.13229925>
2> Fun(3).
6
Funという変数に「 fun(X) -> X * 2 end 」を代入しているのが分かりますね。
なんと、変数に処理を代入しているという不思議なことをやっています。
いずれにせよ、続きを見てみましょう。
束縛されたFunという変数に3を与えて6が返されています。
まるでFunが関数のように働いているのが分かりますね。
無名関数funを使って、変数Funを関数に束縛したのです。
funそれ自体には関数としての名前がないので、無名関数と呼ばれています。
今回はfunに「その場で作成した処理」を代入していますが、関数を代入することも可能です。
長々と説明するよりも、コードを見た方がわかりやすいと思うので、いくつかサンプルを見て行きましょう。
引数を2つ取るfun
3> Add = fun(X,Y) -> X + Y end.
#Fun<erl_eval.12.113037538>
4> Add(3,7).
10
2つの節を使うfun (節については後ほど関数で扱います)
5> ConvertLength = fun({cm,CM}) -> {m,CM/100};
5> ({m,M}) -> {cm, M*100} end.
#Fun<erl_eval.6.13229925>
6> ConvertLength({m,5}).
{cm,500}
7> ConvertLength({cm,75}).
{m,0.750000}
when節で引数の中身を調べるfun
3> Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
#Fun<erl_eval.6.39074546>
funを返す関数やfunを引数に取る関数を高階関数と呼びます。
これも例を見て行きましょう。
funを返す関数
9> Add = fun(X) -> (fun(Y) -> X + Y end) end.
#Fun<erl_eval.6.13229925>
10> Add5 = Add(5).
#Fun<erl_eval.6.13229925>
11> Add5(3).
8
Add(5) は 「 fun (Y) -> 5 + Y end 」を返していますね。
funを引数に取る関数
13> Double = fun(X) -> X * 2 end.
#Fun<erl_eval.6.13229925>
14> List = [1,2,3,4,5].
[1,2,3,4,5]
15> lists:map(Double, List).
[2,4,6,8,10]
lists:mapは関数で、第一引数にfunを受け取り、第二引数にlistを受け取ります。
そして、listの各要素にfunを適用した値を返します。
なんとなくfunのすごさが分かりましたでしょうか。
実はfunの強みは、関数を動的に変更できることにあります。 普通は関数の働きを変えようと思ったら、中のソースコードなりを変えるのですが、 funを引数として渡せば、関数の外から関数内部の働きを変えることができるのです。