« [メモ] 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

コメントする