本気でHaskellに入門したかったので「Get Programming with Haskell」を読んだ

久々の投稿です。

今回は、最近読んだこちらの本がHaskellの入門書としてとても良かったので紹介したいと思います。

www.manning.com

こちらの本は、ManningAmazon で購入することもできますが、サブスクリプション型の O'Reilly Learning (Safari Books Online) でも読むことができます。(ちなみに私はSafariで読みました)

はじめに

私のこれまでのHaskellとの関わりは、数年前に「すごい Haskellたのしく学ぼう! 」(通称: すごいH本)を読んだことがある程度で、その時はHaskellを学ぶことよりも、Monadについての知識を深めることが目的でした。

しかし月日が経過し、心境の変化というか、最近何だか無性に体がHaskellを求め始めてきたので、これを機にちゃんと入門することにしました。

入門するにあたり、すごいH本をもう一度読んでも良かったのですが、どうせなら新しめな本でかつ実践的な内容が書かれている入門書を探していたところ、この本にたどり着いたのです。

この本を読んで得られること

この本は、Haskellの基本が体系的にまとまっていて、しかも文章の構成がとてもうまいので、順番に読み進めていくことでHaskellの以下の知識が身に付くようになっています。

  • 関数型プログラミングの基礎
  • Haskellの基本構文や型、再帰処理
  • 再帰的なデータ構造
  • 代数的データ型(algebraic data type)と各種型クラス(type class)の性質と実装方法
  • IOで不純(impure)な世界の扱い方
  • Haskellの文字列型(String、Text、ByteString)の扱い方
  • GHC拡張
  • Stack(ビルドツール)の利用方法
  • QuickCheckを使用したProperty-based testing
  • JSONエンコード・デコード、DBアクセス、HTTPリクエスト などなど

それと最後まで読んで感じたのが、コードの書き方で、いくつか方法がある場合でも学ぶ人が混乱しないように何種類かに限定し、それを本全体を通して一貫性を持たせていることです。例えば、Haskellにはパターンマッチのやり方が色々あると思いますが、敢えて網羅的ではなく何種類かに絞ったやり方で解説しています。

それ以外にも、let ... in よりも where を、 newtype は紹介こそされていますが、本全体を通してサンプルコードには登場していなかったと思います。また、Monadは、Maybe、List、Either、IOは書かれていますが、Reader、Writer、State等は書かれていないことや、Monad Transformer、Lens、それから並行・並列処理についても書かれていません。

この辺は賛否両論あると思いますが、個人的には、何かの言語を学ぶのに1冊しか読まないということはまず無いと思うので、入門書としてこれはこれで良いのかなと思っています。網羅的に学ぶのであれば、他の本も併せて読んだ方が良さそうです。

見せ方がうまいなと思ったところ

この本は大きく7つのUnitで分かれており、最初の Unit 1 は関数型プログラミングの歴史や利点、Haskellの基本を解説しています。ただし、この時点では型のことは一切触れていないので、まるで動的型付け言語であるかのような見せ方をしています。しかしそれが Unit 2 へ進むことで、実は今まで見てきたものはHaskellの強力な型推論があるからこそ実現できていたことなんだと分かり、そこからHaskellの型の世界へといざなわれていきます。

もう1点、本全体を通して登場する型クラスは、ShowReadNumなど基本的なものから、SemigroupMonoidFunctorApplicativeAlternativeMonad も登場しますが、これらの段階的な登場のさせ方と解説が秀逸なのです。「なるほど、だからこの型クラスがあるのか」と感じさせる。また、もともとHaskellの型クラスは、専用の構文があるので読みやすいのもありますが、それを更に図解していたり、Haskellの歴史も交えて解説している点が非常に良いです。

そう、本全体を通して感じたのが、累進性の実感の原理なのです。

単純なものから始めて、より興味深い視点や入り組んだ視点へと導く方法があります。 景観設計者(landscape architect)は連なった風景を設計するために累進性の実感(progressive realization)の原理を使います。景観設計者は、ものを意図的に隠して景観全体を渡り歩くまでは見えないようにするための、さまざまな眺め(view)を設計します。この考え方は、少しずつ、興味深い段階を踏んで、目指している目的地へと見物人を動かすというものです。あらゆる曲がり角に、新しく、興味深いものがあります。

John Simondsは著書『Landscape Architecture(邦題:ランドスケープ・アーキテクチュア)』の中で次のように述べています。「ある眺めは、計画上最も望ましいとした地点からだけ、最も印象深くその全貌を明らかにすべきである」。それぞれの眺めは、独自に魅力を発揮します。そして、新たな眺めは、それぞれ新たな驚きを含んでいます。累進性の実感により、曲がり角の向こうにあるものへの期待で楽しみが増えるのです。

出典元:「オブジェクトデザイン: ロール、責務、コラボレーションによる設計技法」レベッカ・ワーフスブラック / アラン・マクキーン 著

注意した方が良いところ

1点注意した方が良いところがあって、本の中で、依存ライブラリやデフォルトのGHC拡張の設定を .cabal ファイルに直接編集するように書かれていますが、Stackを使っている場合はpackage.yaml に以下のように記述すると、Stackにバンドルされているhpackが自動的に .cabal ファイルを生成するので、その方法で定義した方が楽だと思います。

dependencies:
- base >= 4.7 && < 5
- aeson
- bytestring
- text

default-extensions:
- OverloadedStrings
- DeriveGeneric

こちらの記事が詳しく解説されていますね。

qiita.com

おわりに

私は、Get Programming with Haskell によってHaskellへの扉が開かれました。次は何を学ぶかは、この本の最後にもヒントが書かれていますし、他にも読みたい本がたくさんあるので、また読んで面白かったらここに書きますね。

追記(2019/07/20)

この記事を公開してから知ったのですが、Get Programming with Haskell の翻訳版が今度出版されるそうです。「英語はちょっと…」という方はこちらをチェックしてみてはいかがでしょうか。

入門Haskellプログラミング

入門Haskellプログラミング