立川 察理:関数型プログラミングの基礎

作成日:2020-12-02
最終更新日:

概要

JavaScript を用いて関数型プログラミングの基礎を解説する。

感想

これも図書館で借りた本だ。 難しい。

アサート関数

関数型プログラミングと直接の関係はないが、アサート関数について pp.94-95 で言及されている。 本書では、assert ライブラリと expect.js ライブラリが紹介されていて、 両者を比較して可読性に富むとされた expect.js ライブラリによる記法を採用している。

p.95 から抜粋する。まず、assert ライブラリは次の通りである。

var assert = require("assert");
assert.equal(1 + 2, 3);

なお、現在は equal メソッドは非推奨らしい。次のようにするのがよい。

var assert = require("assert");
assert.strictEqual(1 + 2, 3);

もう一つは、expect.js ライブラリが紹介されているが、p.95 の注で記載されている expect.js ライブラリはメンテナンスがされておらず、使ってみようとすると、 本書のプログラムで当然 OK となるべきところで実際にはエラーが起きる。 可読性という意味では expect.js は確かに優るが、実際には assert ライブラリを使うしかないだろう。 assert メソッド群については、 (nodejs.org)にマニュアルがある。

高階関数

第7章は「高階関数を活用する」という名前である。その名前の通り、関数を引数とする関数や、 関数を出力とする関数が山ほど出てくる。expect.js を前提としているリストなので、これを assert を使うよう直しながら、 手で打ち込んで挙動を確認していった。すると、 いつの間にか動かない例が出てきた。具体的な last 関数であるリスト 7.21 である。

// concrete_list.js
var last = (alist) => {
  return list.match(alist, {
    empty: (_) => { 
      return null;
    },
    cons: (head, tail) => {
      return list.match(tail, {
        empty: (_) => {
          return head;
        },
        cons: (_, __) => {
          return last(tail);
        }
      });
    }
  });
};

これを Node.js の REPL で食わせると、エラーになる。

> last(cons(1,cons(2,cons(3,empty()))));
Thrown: ReferenceError: cons is not defined

cons の定義を本書のリスト 5.12 に倣って入れて、再度呼び出してみた。

> last(cons(1,cons(2,cons(3,empty()))));
Thrown: ReferenceError: list is not defined at last (repl:5:5)

それはそうだ。list.match など、上記の concreate_list.js のどこでも定義していないからだ。

どうしたらよいか悩んでいるうち、 下記補足の「本書のテストコード」の7章で、listモジュールのコードを list.js として保存し (ただし、var list = { で始まる行を exports = { に変更する)、 concrete_last.js の先頭に下記のコード
var list = require('./list.js');
を入れ再度試してみたら、うまくいった。ついでに、 与えるリストの cons も list.cons のものを使っている。

> last(list.cons(1,list.cons(2,list.cons(3,empty()))));
3

ストリーム型の関数の定義

リスト 6.16 (p.179) で、ストリーム型のテストをしたが、うまくいかない。 リスト 6.14 にある定義をモジュールとして読み込んだのだが、こんなエラーが出る。
Thrown:
TypeError: stream.cons is not a function
6.14 ではオブジェクトの中に関数を定義しているが、これをオブジェクトから外して裸の関数にするとうまくいく。 理由はよくわからない。

補足

書誌情報

書 名関数型プログラミングの基礎
著 者立川 察理
発行日 年 月 日
発行元リックテレコム
定 価 円(税別)
サイズ
ISBN
NDC

まりんきょ学問所関数型言語その他の言語 > 立川 察理:関数型プログラミングの基礎


MARUYAMA Satosi