伝説の名著、"Purely Functional Data Structures"(通常 PFDS)を翻訳しました。4 月末にアスキードワンゴから発売されます。
『20分でわかる Purely Functional Data Structures』などを通じて日本に PFDS を布教した @kinaba との共訳です。ちなみに編集さんはアスキードワンゴ編集長の鈴木嘉平さん。
関数型プログラマ向けの紹介
「リストの結合が O(n) で遅いな」とか「まともなキューはどうやって作るの」とかいった問題に一度は直面したことがありますよね。純粋関数型プログラミングではどうしても無理、と思って諦めている人もいるのではないでしょうか。
この本の技法を使えば、「結合が O(1) のリスト」や「挿入・削除が O(1) のキュー」など、嘘みたいな計算量を達成できてしまいます。もちろん、破壊的更新を使わずに。ああ、15 年前の自分に教えてあげたい*1。
結合が O(1) のリストがほしいだけであれば、既存実装の Data.Sequence あたりを使っとけば良いです。しかし、こういう出来合いのソリューションでは困るケースもあります。たとえば Data.Sequence は償却計算量なので、リアルタイム性が重要だと困るとか。
この本は単なる「結合が O(1) の列の実装方法」ではなく、「効率的な純粋関数型データ構造を実装するための汎用技法」を教えてくれます。効率的な列やキューの実装は、その技法の適用デモとして説明されます。なので、特定のケースで必要なデータ構造もいざとなれば自作できるようになります。
ということで、関数型プログラマを目指すならこの本の内容は確実に抑えておくべきでしょう。プロの方はすでに抑えてると思いますが、ハンドブックとしてお手元に是非。
Rubyist 向けの紹介
言うなれば、「すべてのオブジェクトが freeze した世界で、どこまで効率的なデータ構造を作れるか」を追究した本です。
破壊的更新が使えないのでデータ構造を実装するのが難しくなることが多いですが、逆に簡単になることもあります。たとえば、文字列の結合。普通は、メモリコピーが発生するので遅いですよね。しかしすべての文字列が freeze されていれば、コピーの必要はありません。2 つの文字列を並べた配列として表現すればいいです(こういう実装を Rope と言います)。こういう感じの考え方をひたすら深めていったような本です。
本書自体は Standard ML とかいう馴染みの薄そうな言語で説明されていて、Rubyist に全力でおすすめできる本ではないのですが、ふつうの Ruby から一歩踏み出したい方は ML 系の教科書と合わせて読んでみていただけると嬉しいです。
(『Ruby でつくる Ruby』を読んで「木って、すごく面白いな!」と思ったような人は素質あるかも)
裏話
『Ruby でつくる Ruby』とほぼ同時公表となったこの本ですが、どちらもラムダノートの鹿野桂一郎さんが絡んでたりします。
鹿野さんには TAPL の終わりごろから PFDS の翻訳企画を持ちかけていました。鹿野さんがラムダノートの社長と化したタイミングで再度持ちかけたら、アスキードワンゴの鈴木嘉平さんが企画しているとわかったので、繋いでくれて今回の告知に至る。*2
一方、ラムダノートでやる企画なくなったなーと思っていたら、鹿野さんから「ちょっと変わった Ruby 入門ってどうだろう」と持ちかけられ、『Ruby でつくる Ruby』につながっていきました(非公式あとがき参照)。
ということで
『Ruby でつくる Ruby』と合わせて、みなさん是非読んでみてください!