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

すごい Haskell たのしく学ぼう!は本当にすごいのか?

Book

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

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

今話題の、すごい Haskell たのしく学ぼう!を読んだのですが、ちょっと思ったことがあるので書評と合わせて書いておきます。

思ったこと

関数型言語がこれほど話題になるのはとても嬉しいことです。
しかし、一方で懸念点もあります。

  • ノリで「すごい」とだけ言う人たちがいる
  • その人たちに乗せられて (自分には合わないのに) 買ってしまって、挫折してしまう人が出てきそう

この本は、いい本です。
翻訳の質も素晴らしく、読んでいて「読みにくいな」と思った部分はありません。
それに加え、訳注と Appendix も素晴らしい。
しかし、誰にでも勧めることのできる「すごい本」かというと、それは違うだろう、と思うのです。


なので、この本を読んで関数型の考え方や、Haskell が分からなくても大丈夫です、と言っておきたい。
正直、この本は簡単な本ではありません。
この 1 冊だけで理解しようとしてはいけません。
また、「Haskell を学びたいんじゃなくて、関数型のパラダイムを学びたいんだ。他の言語でも関数型の考え方を取り入れてプログラミングしたいんだ」という人にはお勧めしません。
「とにかく読めよ!」という態度の人に対しては、気にしないでおくか、具体的にどこがどうすごいのか聞いてみましょう。
答えられないのだとしたら、「とにかく読む」必要はありません。

この本を真に勧めたい人

まず第一に、Haskell を本当にやりたいと思っているというのが重要です。
「さらっと読んでエッセンスを取り入れよう」と思っている人はほぼ間違いなく撃沈されることでしょう。
加えて、この本はじっくりと、(出来れば実際にやりながら) 読むべきタイプの本です。
イラストはファンシーでゆるい雰囲気を漂わせていますが、内容はしっかりしています。
じっくり読める、という人には本当にお勧めできます。


ただ、もう一度言いますがこの本は簡単な本ではありません。
ですので、この本だけを読んで理解できなかったとしても落ち込まないでください。
何度も読み込むか、他の本も読んでみるか、勉強会などに参加して分からない所を聞くなどするといいでしょう。

この本じゃなくてもいいんじゃないか?という人

決してこの本を悪く言うのではなく、適材適所というものがあるでしょう、ということです。


関数型の考え方を取り入れたい!という人には、この本ではなくオブジェクト指向プログラマが次に読む本 ?Scalaで学ぶ関数脳入門あたりをお勧めします。
Scala で解説されているものの、がっつり Scala を解説しているわけではなく、関数型のパラダイムについての本となっています。
この本で Scala に興味を持ったのであれば、Scala実践プログラミング―オープンソース徹底活用もお勧めです。


そうではなく、関数型言語を何でもいいからやってみたい!という人には、プログラミングの基礎 (Computer Science Library)をお勧めします。
言語としては OCaml を使っていますが、これもやはりがっつり OCaml を解説しているわけではありません。
この本は教科書ですので、固いなぁと思う人もいるかもしれません。
そういう人には、実践 F# 関数型プログラミング入門をお勧めします。
1 章は色々と言いたいことがあるので、流し読みしてもらうとして、2 章から本格的にどうぞ。
エラッタの修正などが入ったバージョンがPDF版として販売されています。
言語としては F# を使っており、タイトル通り F# の本ですが、すごい Haskell よりもよりライトに読み下すことができるでしょう。

すごい H 本の読み方

他の関数型言語使いの方であれば、サクサク読めることでしょう。
そうではない、関数型言語初心者の方は、まずは 7 章までをしっかり理解しながら読んでください。
8 章でようやく Hello, World が出てきますので、そこをひとまずのゴールとして 7 章までをやりましょう。
そして 9 章でようやく、ある程度意味のあるプログラムを説明しています。
7 章までは分かったが、8 章と 9 章が難しい、という人は、上でも言ったように、他の本を読むなり誰かに聞くなりしましょう。
数をこなせば何か見えてくるかもしれないので、ふつうの Haskell などを読んでみるのはいいかもしれません。


IO について一つ、本書に無い説明を行うとすると、「IO アクションはコマンドパターンのようなものだ」です。
putStrLn などは、実際に画面に文字列を出力するのではなく、コマンドクラスのインスタンスを生成しているのだ、と考えてみてください。
main はそれを受け取ります。そして、main を呼び出すナニモノかがコンポジットパターン的に組み立てられたコマンドを実際に実行していく、みたいなメタファです。

感想

ラムダ式よりも先にセクションを説明するのは、なるほど、と感心しました。
ラムダ式が先に説明されていると、ラムダ式があればセクションを使わなくてもどうにでもなってしまうので、なかなかセクションを有効活用できないという事態に陥ってしまうという人がいます。
まぁ自分のことなんですが、セクションを自然に使えるようになるまでは割と苦労しました。
その点、この順番であればそういう心配はないので、これは素敵ですね。
それだけではなく、全体を通して説明の順番が自然なものになっています。


不満点はそれほどありませんが、色々と言葉が足りないかな、と思う所は多少ありました。
タプルに関してはやはりというかなんというか、ううむ。そんなにリストと隣り合わせて説明したいですかねぇ・・・まぎらわしいだけだと思うんですが。
後は、この本だけでバリバリ Haskell を使ってプログラムが書けるようになるかというと、そうではないと思うんですよね。
にも関わらず、「次どう進めばいいか」に対するポインタが何一つないのが気になりました。


感想としてはとりあえずはこんな感じでしょうか。
色々書きましたが、素晴らしい本であることは間違いないので、「Haskell を始めたい」と思ったのであれば是非読んでみてください。
きっと、良き指導書になってくれることでしょう。