おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

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