« [メモ] Eralng Course: Module 2 - Sequential Programming (中編) | メイン | 日本語係受け解析器 CaboCha »
2007年6月15日
[メモ] Eralng Course: Module 2 - Sequential Programming (後編)
リスト操作 ( 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
http://www.erlang.org/course/sequential_programming.html
投稿者 kawaguti : 2007年6月15日 01:05
トラックバック(0)
このブログ記事を参照しているブログ一覧: [メモ] Eralng Course: Module 2 - Sequential Programming (後編)
このブログ記事に対するトラックバックURL: http://do-gugan.com/cgi-bin/mt/mt-tb.cgi/2002
コメントする