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  
