組み込み関数と高階関数
Getting Started With Erlangの2.12 Built In Functions (BIFs)と2.13 Higher Order Functions (Funs)についてまとめ。
組み込み関数
FizzBuzzで使用した"rem"などが組み込み関数として用意されています。
- 組み込み関数はerlangモジュールに属する。
- 呼び出す時にはモジュール名を省略できる。
サンプル。「date().」は「erlang:date().」と同じ。
1> date(). {2007,11,12} 2> erlang:date(). {2007,11,12}
高階関数(Higher Order Functions)
JavaScriptの関数オブジェクトみたいなもの。(という認識でよいのかな?)
- 「<変数名> = fun(<引数,..>) -> <関数の処理> end.」の形式で作成する。変数に関数が代入されるイメージ。
- 作成後は「<変数名>(<引数,..>).」で関数を実行できる。
- 変数になっているので関数の引数で渡したりできる。
- 「fun [<モジュール名>:]<関数名>/<引数の数>」で定義済みの関数を高階関数として取得できる。
高階関数のサンプル。配列を列挙します。
-module(each). -export([each/2]). % 配列を列挙する。 each( [], Fun ) -> ok; each( [H|R], Fun ) -> Fun(H), each( R, Fun ).
実行してみます。
19> each:each([tora, mii, kuro, shiro], fun(K)-> io:format("~w~n", [K]) end ). tora mii kuro shiro ok
↑では引数を無名関数として作成していますが、↓これでもOK。関数をあらかじめ定義しておき、それを引数で指定します。
-module(each). -export([each/2, out/1]). % 配列を列挙する。 each( [], Fun ) -> ok; each( [H|R], Fun ) -> Fun(H), each( R, Fun ). % データを出力する。 out( K ) -> io:format( "~w~n", [K] ).
実行。
22> each:each([tora, mii, kuro, shiro], fun each:out/1 ). tora mii kuro shiro ok