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