プログラミング言語論 第2回レポート


  1. (型クラス)

    プリント第4章 p.4 問4.5.1
      または
    プリント第4章 p.5 問4.6.1
    どちらか1問を選択して下さい。

    参考にするプログラム: TypeClassExample.hs ()

  2. (Prolog)

    プリント第 6章 p.6 問6.4.2

    参考: 問6.4.1の解答例

    ?- append([1,2], [3,4], X).
    これに対して、 append([H1|X1], Y1, [H1|Z1]):- append(X1, Y1, Z1). が、
    H1=1, X1=[2], Y1=[3,4], X=[1|Z1] で適用できる。

    ?- append([2], [3,4], Z1).
    これに対して、 append([H2|X2], Y2, [H2|Z2]) :- append(X2, Y2, Z2). が、
    H2=2, X2=[], Y2=[3,4], Z1=[2|Z2] で適用できる。

    ?- append([], [3,4], Z2).
    これに対して、 append([], Y3, Y3). が、
    Y3=[3,4], Z2=[3,4] で適用できて、ゴール節が消える。

    まとめると、 X = [1|[2|[3,4]]] (= [1,2,3,4])

  3. (モナド)

    次の C言語で記述された関数と(Cのint型と Haskellの Int型に共通する範囲において) 同等の関数を Haskellで定義せよ。

    int baz(int n) {
        int p = 1;
    
        while (n > 0) {
            if (n==11) {
                break;
            } else if (n%2==0) {
                p*=n;
                n -= 2;
            } else {
                p*=n;
                n -= 4;
            }
        }
        return p;
    }
    

    なお、Cの %に対応する Haskellの演算子は`mod`である。

    作成した Haskellの関数と元の Cの関数の定義の対応が 明らかでない場合、簡単に説明すること。

    参考にするプログラム: FactST.hs(プリント 第5章 p.13 上のプログラム) ()

  4. (CPSへの変換)

    プリント第7章 p.17 問7.9.1
    このHTMLファイルを元にして下さい。

    参考にするプログラム: Hanoi0.html, Hanoi0.js (), Hanoi.html, Hanoi.js (), Fib.html, Fib.js ()

できるだけ短く簡潔におさめて下さい。

提出〆切は、8月7日(金)の18:30です。提出場所は、香川のレターボックス(7F 学科事務前)です。 (オンラインの提出はありません。)


プログラミング言語特論のホームページ
Koji Kagawa