「すごいHaskell たのしく学ぼう! 」 書評
こんばんは、 kuwana-kb です。
職場の人のススメでHaskellの勉強をはじめました。 Haskellとは、純粋関数型言語の1つで例えば以下のような特徴を備えています。
ん〜なんだかあまり見慣れない概念が多い…色々学べそうですね! 今回は、そんなHaskellに入門すべく「すごいHaskell たのしく学ぼう!」(通称:すごいH本) を読んだので書評していきます。
- 作者:Miran Lipovača
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
ざっくり3行でいうと
- Haskellの良さが実感できた
- 初学者でも理解しやすいような配慮が随所に
- 内容が古い箇所があり、躓きポイントがある
この本の3つのポイント
1. Haskellの良さが実感できた
Haskellをやったことがない人向けに、まずは本書を通じて感じたHaskellの良さをまとめます。
まず、書いていてとても楽しいです。 記法がシンプルなのに加えて、型推論やパターンマッチング、代数的データ型などの強力な言語機能がこれを実現していると感じます。 他の言語だと複雑になりがちな処理もHaskellだととてもシンプルになります。 以下は他言語とHaskellの比較をした記事です。 記事内のサンプルコードを一目見るだけでも、そのシンプルさが伝わると思います。
Haskellのこのシンプルさは、プログラミングへの理解も深めてくれたように感じます。 例えば、私は複雑な高階関数や再帰関数を読むのがあまり得意ではなかったのですが、 Haskellで表現すると、今まで複雑に感じていた構造もシンプルになり理解しやすかったです。 そして、Haskellで理解できるようになると、「Haskellでいうあの表現と同じか」と置き換えが効くようになるので、他言語でも応用が効くように感じました。
また、Haskellの持つ強力な言語機能も、コードの表現の幅を増やしてくれるように感じます。 例えば、Haskellのパターンマッチはコードをシンプルかつ読みやすくしてくれる良い機能です。 本書でパターンマッチの良さを実感した結果、「Rustのパターンマッチを有効活用しよう」と考えるよいきっかけになりました。 (逆にHaskellの言語機能が強力すぎて、Rustじゃこれできないのか…と不便を感じることもある)
参考:以下のように引数をパターンマッチで場合分けするこで、処理を切り替えることができる
add :: [String] -> IO () -- リストの中身が2要素の場合の処理 add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n") -- リストの中身が上記以外の場合の処理 add _ = putStrLn "The add command takes exactly two arguments"
2. 初学者でも理解しやすいような配慮が随所に
本書は初めてHaskellを触る人向けといえます。
まず全体の構成がとても良いです。 ざっくりと以下のような構成になっています。
- 序盤で基本的な構文や型について覚える
- 中盤で問題をHaskellを使って解いていく
- 後半でこれまで学んだ機能を抽象化した概念を学ぶ
HaskellにはMonadやFunctorといった抽象的なインターフェースがあり、 これがそこそこ難解なのですが、上記の段階的に学習する構成によって学習曲線がゆるくなっていると思います。
また、各章はその章で扱う標準的な関数や型を自分で書いてみることから始まります。 ライブラリの実装を確認して、自分の手で書いてみてどういう実装になっているか理解するという段取りです。 例えば、map, zip, elemといった関数や、 Maybe, Either, Listといったデータ型を自分で宣言します。 このように使い方の説明だけでなく、実装まで踏み込む入門書は結構珍しい気がします。 この解説法のメリットは仕様の理解につながるのに加えて、インタプリタ(ghci)の使い方や公式ドキュメントの参照にも慣れることができた点です。
入門書としてもう1つ大事な要素として「飽きずに読み切れるか」という点があるかと思います。 この点も全く問題ありませんでした。 文体はかなり砕けていて堅苦しさが全くありません。(逆に、人によっては冗長と感じるかもしれませんが…) 一方で、内容は初学者にもわかりやすく、上述の通りしっかりしています。 年末から読み始めましたが、特にペースが落ちることなく最後まで楽しく学習ができました。
3. 内容が古い箇所があり、躓きポイントがある
Haskellは言語機能やライブラリのアップデートが早いようで、 本書に記載されている内容だと動かなかったり躓くケースがいくつかありました。
- 型クラスの関係性が変わっていて、コンパイルエラーになる
- Monoidのインスタンス宣言時に、Semigroupも宣言する必要があった
- 関数が属するライブラリが変わっていて、コンパイルエラーになる
- strMsgという関数。transformersというライブラリを入れる必要があった
Monoidのinstance宣言を写経していたら怒られたのだが、ghc 8.4からMonoidはSemigroupのサブクラスであることを学んだhttps://t.co/YNFRCFiQEe
— kuwana-kb (@kuwana_kb_) 2020年1月6日
本のとおりに書いてもちょくちょく動かないことがあるので、 その場合はコンパイラーのエラーを読んだり、Hoogleで公式のドキュメントを読むことで対処しました
また、エコシステム周りも色々と変化があるようです。 書籍上だとghcという標準的なコンパイラを使います。 しかし、書籍にはプロジェクト管理をしたくなったときの情報がなく、ネット上だとstack や cabalなどのツールの候補に関する情報が散見されて混乱しました。 私は以下の記事を参考にしました。
具体的な開発環境としては以下のようにしました。
- エディタ
- プロジェクト管理
- stack
他にもいいツール等あればぜひ教えて下さい!
まとめ
すごいH本はタイトル通りHaskellを楽しく学べる良い書籍でした。 ネット上のHaskellの記事を読むと、「Haskellが難しい」という情報が目に飛び込んできて敷居の高さを感じる人もいるかもですが、 ある程度プログラミングを経験した方であれば挫折することなく読み切れると思います。 ちなみに私は「ある程度理解はできたけど、いざ自分でなにかツールを作れと言われるとまだ難しい…」といった理解度なので、 まだまだHaskellは難しいなという感想です。とはいえ、こんなに良い書籍があるのですし、入門の敷居を必要以上に高く設定することもないのでは、と思いました。
ということで、Haskellに興味のある方はぜひすごいH本を読みましょう!