Erlangの勉強その2
すべての関数はモジュールに属している。
-module(restaurant).
関数は以下のように定義する。
menu(coffee) -> 190;
menu(burger) -> 290;
menu(coke) -> 100.
これをシェル(つまり外部)から使うにはexport定義をしてやる必要がある。
-export([menu/1]).
関数名のあとのスラッシュの後ろは引数の数を表している(これをアリティと呼ぶ)。
実際にシェルから使ってみる。
1> c(restaurant).
{ok,restaurant}
2> restaurant:menu(coffee).
190
3> restaurant:menu(coke).
100
無名関数はfunという名前で定義する。
1> SubTotal = fun(Item, Count) -> restaurant:menu(Item) * Count end.
#Fun<erl_eval.12.115169474>
2> SubTotal(coffee,3).
570
3> SubTotal(burger,2).
580
listsモジュールには、RubyでいうEnumerableモジュールのような便利な関数がそろっている。
4> lists:map(fun({Item, Count}) -> restaurant:menu(Item) * Count end, [{coffee, 3}, {burger, 2}]).
[570,580]
map関数の第一引数に、リストの各要素に適用される関数を指定してあげる。第二引数はそのリストだ。
funを返す関数も定義できる。
5> Member = fun(Count) -> (fun(Item) -> restaurant:menu(Item) * Count end) end.
#Fun<erl_eval.6.56006484>
6> ItemValue = Member(3).
#Fun<erl_eval.6.56006484>
7> ItemValue(coffee).
570
8> ItemValue(burger).
870
リスト内包表記を使うと、もっと簡潔にリスト処理が行える。
9> [{restaurant:menu(Item), Count} || {Item, Count} <- [{coffee, 3}, {burger, 2}]].
[{190,3},{290,2}]
10> lists:sum([restaurant:menu(Item) * Count || {Item, Count} <- [{coffee, 3}, {burger, 2}]]).
1150