「すごいHaskellたのしく学ぼう!」は気配りと楽しさがすごい

すごいHaskellたのしく学ぼう!
本書はHaskellの入門書です。とっても親しみやすい内容と文体で、構成についても、順序を踏んで丁寧に書かれているようです。また日本語(マルチバイト文字)の扱いを付録で解説しているのもポイント高いですね。

以下、ざっくり目を通して、これは!と思った点をまとめました。

イントロはHaskellの概要をやさしい文体で、でもしっかり説明しています。 Haskellがもつ純粋さと参照透明性の重要さ、必要最小限の計算を行う遅延評価であること。型付けが重要なのは当然として、型推論がすばらしいこと。さいごに「Haskellはエレガントで簡潔です」。

全体として:気配り

翻訳が読みやすいです!親しみやすさが日本語になってグッと増した感があります。翻訳文であることを全く感じさせません。
また随所で、著者の気配りを感じさせられます。 文中の補足説明やNOTEが親切です。たとえば、初見ではワケわからない型の周りエラーの読み方 (No instance for (Num [Char])とか) が1章の最初にあることからしてもそう。 5(数値リテラル)は実はすごいやつで、整数にも浮動小数にもなれるとか。項や型の読み方をその時点で必要な分だけ丁寧に説明して、残りは後ろの章に送っているのも良いですね。
前半の構成はなるほど王道! Haskellで最も重要な「型」は2章で読み方とともに基本が丁寧に解説されます。続けて、2.4節で型クラスの基本が分かってしまうのはお得感があるね。

「すごいHaskell」な所

普段はまったく内容を説明しない挿絵ですが、ヤマ場ではちゃんと内容を説明しています。最初のヤマ場はfoldとか再帰とか二分探索とか。どちらも関数型の肝といえる部分で、7.7の解説は熱が入ってます!
挿し絵が本文の内容をちゃんと説明をしていたら、その内容が「すごいHaskell!」な所じゃないかなと思ったりしている:)

型クラスを「たのしく」

二つ目のヤマ場は前半のゴールともいえる「7.8 型クラス 中級講座」。その直後で型クラスを応用する方法が面白い。JavaScriptを引き合いに出して、YesNoという型クラスを作って遊んでみる。 それほど長くない節だけれども、型クラスのオープンさと、プログラミング的楽しさがよく出ていると思う。

実用もちゃんと意識してます

IOは、当初は8章でモナド無しで(do構文で)導入されます。モナドはもっと後。しかし ByteStringが9章で紹介され、文字列処理は高速にチューニングできるんだよ、と語られる。 Haskellを実用するうえで避けて通れない問題です。(付録も含めて。)

10章「関数型問題解決法」これは気になるよね! 関数型プログラミングのエッセンスです。たぶん中盤のヤマ場です。 なぜなら挿し絵がちゃんと仕事してるから! 逆ポーランド電卓と、単純化した最短路問題を解きます。これも「たのしく」て、かつ手ごろで良いと思う。

本書のユニークな点:Applicativeの次にモナド

本書の最もユニークな点はモナドの説明にApplicativeを使っているところ。いきなりモナドを説明するのでなく、Applicativeという中間ステップを踏めば、たしかに概念的なジャンプが少なくなる気がする。
とくに注目したいところは、IOアクション同士をつなぐ方法としてApplicativeを最初に使っているところだ。 pure (++) <*> getLine <*> getLine *1 と書けば、文字列を連結する (++) を、IOアクション getLine の戻り値に適用していることがわかる。 (++) str1 str2 の 関数適用の空白を <*> に置き換えればこの形になるので、IOアクションを合成する最初の方法として良い感じ。

うゎぁあああああ落ちるぅぅうううああああ

13.4「綱渡り」。モナドを説明するヤマ場です。ついに発狂したと思ったよ。でもマジです。Applicativeではダメで、モナドが必要な理由がここで明らかになります。
まず「普通の値を取り、モナド値を返す関数」の必要性が語られます。

landLeft :: Birds -> Pole -> Maybe Pole 
landLeft n (left, right)
    | abs((left+n)-right)<4 = Just (left+n,right) 
    | otherwise = Nothing

leftとrightの差が4以上になったら、バランス崩れたのでしっぱーい。ナッシングというわけ。
そして、こういう関数を合成しようと思ったら、Applicativeではむり。モナドの出番というわけだ!Hooray!

すごいリストモナド

後半戦の最初のヤマ場、すごいHaskellな所はリストモナドだ。納得。それにp.303の絵をみればちゃんと仕事してるし:) 威力はチェス盤の上で示されます。ナイトの動きを非決定的計算で全て列挙してみよう!
(続いて14章では各種モナド&モナディック関数(mapMとか)の紹介があり、これで普通にHaskellを使えるようになりましたね!という構成。無いのはContモナドくらいのものだけど、あれ私はあんまり使わないし本書には要らないと思う)

さいごにpureなzipper

最後にzipperが来て、モナドなくてもHaskellすごい! となるわけです。(挿し絵調べ)ここはまたちゃんと読みたいです。
そして15.5節、感動のフィナーレが君を待つ。

私に関して言えば

ApplicativeやZipperの章はあまり真面目にやってなかったので役に立ちました/立ちそうです。また後半でも普通に役に立つ訳注があり読み応えがあります。(そういうピックアップが目的なら、PDF版がサクサク読めるのでいいですね)。付録、マルチバイト文字とViewPatternとの組み合わせも面白い!訳語表があるのも信頼できます

気になった(些細な)こと

  • バッククォートの書体が文中とコードでかなり異なりますね。仕方ないのかな
  • p.26右下の空白はなに?
  • p.61の右にも何か空白がある。絵が抜けてるのかな。
  • p.288の右

何かPDF版の挿し絵が一部抜けているような気がしますねー。 ビューアの問題かな。→ オーム社開発部ブログにアナウンスがありました

  • 私の環境(MacOSX 10.7.3) で Preview.app を使って閲覧すると絵が欠けるのですが…ううむ
  • Adobe Readerなら正しく表示されるようです(私も確認ずみ)
  • どうも10.5系のPreview.app だと正常に表示され、10.7系だと挿し絵が欠けるようです。10.6は手元にないので不明。 これは発覚しづらいですね。。

weak pointとか

  • Hackageの紹介を8章の訳注扱いにとどめるのではなく、付録とかでHaskellの有用なライブラリを紹介できたらいいかなと思う(欲張り)。DB, Web, コンパイラ, 並列など, 面白いトピックは多いと思う。(でも、それ特有の難しさはあると思う(枯れやすいとか))

*1:原文では (++) <$> getLine <*> getLineだけど、<$>の意味はちゃんと説明されている