Hatena::ブログ(Diary)

まめめも このページをアンテナに追加 RSSフィード

2017-03-16

"Purely Functional Data Structures" の邦訳『純粋関数型データ構造』が発売されます

純粋関数型データ構造
Chris Okasaki
KADOKAWA (2017-04-28)
売り上げランキング: 266

伝説の名著、"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』と合わせて、みなさん是非読んでみてください!

*1:原著はそれより前(1998 年)に出版されているわけですが。

*2:さらっと言いましたが PFDS の翻訳も容易ではありませんでした。遅延評価の force とか suspension とか意外に定訳がない単語が多かったり、アホな誤訳をちょくちょくかましていたり。共訳の @kinaba 殿やレビュアーの方々に救われて出版にこぎつけました。感謝の限り。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ku-ma-me/20170316/p1