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