プログラミングHaskellでHaskellをもう一度勉強する
Programming in Haskellという本がおすすめらしい、という話は以前に読んだことがあって、買おうかどうか迷ったりしたこともあったのだが、先日日本語訳が出たので、そっちを買った。これは確かに良い本だと思ったので感想を書いておく。
その日本語訳というのが、プログラミングHaskell (Graham Hutton 著, 山本和彦 訳) である。
まず、とても薄い本である。付録まで入れても200ページちょっとしかない。だから、これを読んだからといってすぐにHaskellで実用的なプログラムが書けるようになるわけではない。本書がサポートするのはあくまでもHaskellでプログラムがある程度書けるようになる、というところまでで、実のところ、それは既存のHaskellの入門書でも十分に可能だ。そして、大学の先生が書いた本である(著者はノッティンガム大学の教授である)ので、なんというか、優しくはない。必要なことは書いてあるが、手取り足取りという感じではない。モナドの説明などは、意図的なのかもしれないが、非常に少ない。このあたりは、例えばふつうのHaskellプログラミングあたりを読んだ方がずっと詳しく書いてある。
では、他のHaskellの入門書にはないこの本の魅力は何か。それは、著者が大学でHaskellを10年以上も教えてきた経験から来ているのであろう、何気ないところでのちょっとした記述であると思う。例えば、P.107にはIOモナドの話が書いてあるのだが、「プログラムがIOモナドだらけになるのでは?」という疑問に対し、「しかし、実際はそうはならない。ほとんどのHaskellプログラムでは、大多数の関数が対話に巻き込まれず、少数の対話関数が外界に最も近いところで対話を扱う。」と答えがある。まぁ自分でプログラムをいくつか書いてみればわかる話ではあるんだけど、こうやってよくありそうな疑問に対して答えが書いてあるのは、好ましいと感じる。P.89のパーサーの説明なんかも、なにげないところではあるんだけど、実際に自分がパーサーの重要性を他人に説明するところを想像してみると、わかりやすさと記述の簡潔さを両立できるようにしっかりと考えられているんだなぁ、ということを感じ取ることができて、なんだか嬉しくなる。
訳注も良い。例えば、P.106には「アクションの型は単なるIO aであって、「→」は含まれないことに注意」と訳注があるのだが、これは確かに最初は言われないと気づかない人も多そうだ。
また、もう一つ本書には特色がある。取り上げられている題材がいい感じで、読んでいて楽しい。例えば、3章でシーザー暗号を作っているのだが、単に暗号化、復号化を行うだけではなく、カイ二乗検定を使って暗号を破る関数を作っている。破り方まで書いてある入門書は、他にはあんまりないと思う。他にも、11章では切符番号遊びという、4つの数字の加減乗除で任意の整数が作れるか、という問題が載っているのだが、単純な総当たり法から、最終的には無駄な計算を省いて100倍ぐらいの高速化を達成している。単純に解くだけではなく高速化までやっているところが面白い。
不満点もある。冒頭にも上げたが、ページが少ないこともあって、入出力やモナドの扱いが非常に小さい。さきほど挙げた副作用の話も、なぜ純粋さを取り戻せる可能性がないのか、どうしてこのような仕組みになっているのかがわからない。Haskellでプログラムを書くための本であって、Haskellと他のプログラミング言語の違いを論じたりする本ではないという事で割り切って書かれているのだろうし、実際のところdo記法の使い方がわかっていれば入出力もそれなりに書ける訳だが、もう少し説明が欲しかったなぁと思う。