読者です 読者をやめる 読者になる 読者になる

Diary over Finite Fields

515ひかるが書き溜めたメモとコラムと雑記

すごいHaskellたのしく学ぼう!を読んだ感想

『すごいHaskellたのしく学ぼう!』を読み終えました。タイトルに違わず、Haskellがすごいことを楽しく学べる本でした。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

人生で初めて最初から最後まで読んだ技術書になりました。だいたい一ヶ月くらいかかったでしょうか。最後の方は普通に難しいけれど、著者の工夫もあって楽しく読めることは変わらなかったのでよかったです。

初学者、初心者目線で感想を書こうと思います。ちなみに僕が初めてHaskellのコードを書いたのはこの本を読んでからです。内容に関してはあまり触れません。

なぜ読んだか

僕がこの本を読んだのは、なんとなくHaskellを勉強してみたくなったからです。やりたいことがあったわけでも、目的のためにHaskellを選んだわけでもありません。強いて言うなら、時間をかけてプログラミングの本をきっちり読むという経験を積みたくはあったので、読みやすいとの評判を聞いたことがあったこの本を選びました。

読んでいてまず思ったことは、この本はあくまでもHaskellの文法を学ぶための本であって、これを読めばHaskellで何かができるようになるというタイプの本ではないということでした。あくまでも多くの人のHaskellを学ぶ最初の1冊になるように工夫されて書かれたものだと思います。あと、Haskell固有の解説がなされているので、汎用的な関数型プログラミング入門とは趣向が違うと思います。

以上を踏まえてHaskellの文法入門書として感想を書きますと、初学者でもHaskellがすごいことを楽しく理解できるよう工夫が凝らされていて、飽き性で面倒くさがりな僕でも最後まで読み通すことができました。

よいと思ったところ

一貫している著者の態度

まず最初にすごいなぁと思ったのは、一貫している著者の態度です。「初心者」、つまりHaskellの経験どころか、プログラミングの経験があまりない人をも対象にしているといこと。そして、難しい概念であっても徹底して敷居を下げるように工夫がなされていること。

敷居をさげる工夫のひとつとして、この本ではまとまったプログラムを作ることがほぼありません。関数を定義して、対話環境(GHCi)にロードして実行してみるというのを第1章から最終章まで全てでやっています。後半のほうで実行結果が長いものは一部省略がなされていますが、基本的にほぼ全てのプログラムについて実行結果が載っているので、プログラミングの基本のTry & Errorがしやすくなっています。

随所に垣間見られる初心者への優しさ

変な絵とか面白くないジョー*1が特徴のこの本ですが、こうしたことは全てこの本やHaskellの言語の抽象的な概念に対する敷居を下げることが狙いだと思います。Haskellにおける様々な概念は良くも悪くも抽象的で、再帰、カリー化、部分適用、畳み込みなどが第4章から第5章にかけて説明されますが、初見でこれらのことが「よくわかる」人はほとんどいないでしょう。しかし本書の解説は絶妙で、再帰や畳み込みなどわかりにくい操作をするときはきちんと図で解説することで読者を導き、カリー化や部分適用については簡単な例を複数挙げ、有用さを読者に体感させるように工夫されています。しかもzipWithflipなど基本的な関数の再実装を通し、再帰、カリー化などの概念の復習や理解しているかどうかのテストまで自然な流れの中に盛り込んでいます。

選ばれる題材も初等的なものが多いです。第10章での畳み込みを使って逆ポーランド記法電卓を作る、最短経路を求めるなど具体的な問題をエレガントに解くのはHaskellの威力を見せつける上でも効果的な題材だと思います。逆ポーランド記法電卓は僕も過去に講義で別の言語で作らされたことがありますが、Haskellだと一瞬で作れてしまって拍子抜けしました。また、あとでモナドなどを解説したあと電卓にエラー処理を加えるといった改善するパートを盛り込まれています。このように自然な形で同じ題材を何度も扱い、本書を読み進めているだけで復習の機会も得られます。また同時に、過去のコードの問題点を発見し改善するという態度の徹底しています。いずれも重要なことだと思います。

さらにすごいことに、入門書なのに難しいことを妥協して曖昧にせず解説がなされています。特に難しいことを難しいと書いているところには共感が持てます。あらゆることを「簡単だ」と書くのはときに無責任にも感じられますが、この著者からはそうしたことは感じませんでした。

惜しいなと思ったトコロ

できれば訳注でもなんでもいいので、次の1冊みたいなものを例示してほしかったです。この本はあくまでもHaskellの文法を学ぶための本であって、何かを作れるようになるよう力をつけることが目的ではないのでどうしようもないのですが、だからこそ次に読むべきものを例示してほしかったです。

また、この本の構成的にどうしてもIOアクションの出番が少ないので、第8章と第9章の入出力の部分が手薄かなと感じます。遅延入出力なんかも正直よくわかりませんでした。

総評

何はともあれ、飽き性で面倒くさがりな僕でも最後まで読み通すことができた本なので、詰まらせないような工夫がしっかりされている初学者向けの本だと思います。僕はこの本を読んでけっこうしっくり来たので、Haskellをもっと書いてみたくなりました。

もしこの記事を読んでくれた有識者のかたがいれば、次の1冊みたいなものの例示をしていただけると本当に嬉しいです。

*1:このジョークを和訳に反映させるのは大変だっただろうに。