Erlang World


top > module and function > fun

fun

無名関数(fun)

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を引数として渡せば、関数の外から関数内部の働きを変えることができるのです。


Yuichi ITO. All rights reserved.
mail to : ad
inserted by FC2 system