すべての関数はモジュールに属している。

-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