『すごいHaskellたのしく学ぼう!』の感想

はいどーもHaskellを勉強してみたニートです。
本日は『すごいHaskellたのしく学ぼう!』の感想記事を書こうと思いますよ。
結論を先に書いておくと、全然理解できませんでしたw

関数型プログラミング

関数型プログラミングを学んでみたくて僕が選んだ言語がHaskellでした。
関数型には「純粋」であるか否かというものがあって、Haskellは純粋なものでした。
純粋な関数型は一度作った値は変更できない(イミュータブル)らしく、「どうせやるなら純粋と言われる関数型を試してみたい」と思ったわけですね。
で、Haskellで評判が高かった本が『すごいHaskellたのしく学ぼう!』でした。

モナドを知りたかった

関数型についてググっていると、よく「モナド」という言葉が出ます。
これについての解説サイトを読んでも、ぶっちゃけ意味が判然としませんでした。
このモナドについて知りたかったのと、他の関数型に特有の(かどうかは知りませんが、少なくとも今までのプログラミング言語の解説書には出てこなかった)用語を知りたかったので関数型を勉強しようとしたわけです。
ですが本を開いてみると……。

名前と語調に騙されてはいけない

「たのしく学ぼう!」というと、いかにもプログラミング初心者を対象とした風な印象を受けますが、この本は「今まで手続き型(あるいはオブジェクト指向)プログラミングをゴリゴリにやってきた人が、Haskellを学ぶ」ためのものです。
非常に親しげな語り口で本書は進んでいくのですが、内容はとても難解で、プログラミングが完全な初心者では全く太刀打ちできないでしょう。
というかぶっちゃけ僕が内容の5割も理解できませんでした。
あとHaskellの文法に慣れることが全然できませんでしたね……。

解説の順序

本書を読んでいると、よく「文脈」という用語が出てきます。
これはオブジェクト指向言語の解説書では見たことのない言葉でした。
Haskellで生成された値は「文脈」を持つ場合があるようです。
これが最初全く理解できなくて、非常に困りました(何の役に立つのか本書を読んでも意味がわからなかった)。
ですがアプリカティブファンクター等の解説に進むにつれ、この「文脈」の意味が徐々にわかってきて、モナドの項目に進む頃には「たしかに文脈は大事だな」と思えるようになりました。
これに限らず、本書全体として、解説の順序が「これ逆の(あるいは先に解説した)方がわかりやすくない?」と思うものが多々あります。
初見では全体を軽く流すにとどめて、二回目三回目で「これはアレのことだな」と確認しながら進めるのがよいのかなーと思いました。

今まで使ってきた言語にも活かせる

今までに使ってきた言語でも関数型の考え方をある程度取り入れることはできるなと思いました。
例えば「値はイミュータブル」というのは、まさにそのようにクラスを作ればいいだけの話です(というか普通は作るはず)。
また、「インスタンスメンバを変更すると同時に値を返さない」なんかはリファクタリングの本にも載っていました。
ですが関数型に固有の考え方も確かにあって、「文脈」やら「モナド」やらの考えを応用するのは難しいのかな? と思いました(すでに応用して色々と作っている方がいるかもですが)。

用語についてはふんわり理解できた

肝心の「モナド」やら「ファンクター」やらについては、ふんわりと意味を理解できました。
ですが「じゃあ、今からモナドとファンクターの違いを400字以内で説明してよ」と言われても「えーっと……」となるレベルなので、もう一周か二周はしたいですね。
あ、「カリー化」については別の本(確かオブジェクト指向の解説書だったような)であらかじめ知っていたので、わりとすんなり理解できました。

終わりに

ひとまず最後まで読み通しましたが、中盤あたりからは、数分読んで理解できなかった部分はさっさと飛ばすようにしました(それまで数ページ進むのに1時間かかることもザラだったため)。
これはこの記事中にも書いた通り「あとでもっとわかりやすい例題が出てくる」ことが何度かあったからです。
というわけで、そのうち時期を見て本書は再読したいと思います。
可能そうなら、実務レベルで使える言語としてHaskellを選択できたらなあ……と思っていますが、どうなるかはわかりませんw
「これって数学を知っていないと本当には使えるようにならないんじゃないかなあ」と感じるところも多々ありましたので……w
まだHaskellを何に使えばいいのかわかっていないので、そのへんもおいおい考えていきたいなあ……と思っています。
あっPHPもしたいですね……。
やりたいことだらけです。

フォローする