リスト操作 ( Traversing Lists )
よくあるパターン (このへんはProlog)
Xを合計するsum関数の結果を、
Xの数を出すlen関数の結果で割った
ものが avarage ですよ。
average(X) -> sum(X) / len(X).
sumはリストの一番前と、その
残り要素のsumを足した物ですよ。
(再帰を使って総和を求める)
sum([H|T]) -> H + sum(T);
sum() -> 0.
lenは (1 + 先頭をのぞいた
残りのリストのlen)ですよ。
len([_|T]) -> 1 + len(T);
len() -> 0.
ほかにこんな再帰のパターンがよくある
リストの各要素に2をかけたリストを返す
double([H|T]) -> [2*H|double(T)];
double() -> .
第一引数のものが、第二引数のリストの
要素に一致するならtrue
member(H, [H|_]) -> true;
member(H, [_|T]) -> member(H, T);
member(_, ) -> false.
リストとアキュムレータ ( Lists and Accumulators )
リストの平均を計算する例
average(X) -> average(X, 0, 0).
average([H|T], Length, Sum) ->
average(T, Length + 1, Sum + H);
average(, Length, Sum) ->
Sum / Length.
末尾再帰(tail recursive)。
LengthとSumがアキュムレータ(加算器)の役。
再帰しながら、引数に渡される値が足され
ていく。
avarage([])はラインタイムエラーになる。
エラーハンドリングは後の章で。
Erlang起動 (Starting the system)
erlでシェルが起動する。
Prologとか、Tcl/tkのtclsh/wish みたいなものである。
一行ずつ打てばそのままそれがシェル世界に反映する。
毎行、打ち込んだ行がevalされる(Perl/JavaScript)、ということ。
> erl
Erlang (BEAM) emulator version 5.5.2 [source]
[async-threads:0] [kernel-poll:false]
Eshell V5.5.2 (abort with ^G)
1>
記述済みのソースファイルを取り込むには c/1 をつかう。
1> c(hoge).
{ok,hoge}
2>
- - -
Eralng Course: Module 2 - Sequential Programming