「Mastering Functional Programming」を読んだ

Packt PublishingMastering Functional Programming を読みました。今回はこの本について書きたいと思います。

www.packtpub.com

どんな本か

この本はざっと次のような内容が書かれています。ちなみに言語はScalaです。

  • 関数型、命令型プログラミング双方のアプローチの違いについての比較
  • 副作用を抽象化し参照透過性を維持させる方法
  • 型クラスでWriterやIOなどのEffect Typeに対してビヘイビアを注入する方法
  • Cats の構成と利用頻度の高い型クラスについて
  • Cats Effect を使用した並行プログラミング
  • Typelevel.scala の各種ライブラリを使用したWebAPIの実装
  • Monad TransformerやTagless Final、HListなど、FP特有のパターン
  • アクターモデルとそのユースケース

内容的には、Scala with Cats の前に読むと良さそうかなと思いました。

理解度に応じた読み方

目次はこんな感じになっています。

  • Chapter 1 The Declarative Programming Style
  • Chapter 2 Functions and Lambdas
  • Chapter 3 Functional Data Structures
  • Chapter 4 The Problem of Side Effects
  • Chapter 5 Effect Types: Abstracting Away Side Effects
  • Chapter 6 Effect Types in Practice
  • Chapter 7 The Idea of the Type Classes
  • Chapter 8 Basic Type Classes and Their Usage
  • Chapter 9 Libraries for Pure Functional Programming
  • Chapter 10 Patterns of Advanced Functional Programming
  • Chapter 11 Introduction to the Actor Model
  • Chapter 12 Actor Model in Practice
  • Chapter 13 Use Case: A Parallel Web Crawler

この内、ScalaのコレクションフレームワークやOption、Either、Future、Tryが分かっている人はChapter 6まで読み飛ばして良さそうです。それと、型クラスを理解しているのならChapter 7は読まなくても良さそう。あと、Akka実践バイブル などでAkkaをある程度理解している人であればChapter 11以降は読まなくても良さそう。

つまり、Cats をはじめとする Typelevel.scala の各種ライブラリに触れるだけの目的であれば、Chapter 8 〜 10 だけ読めば十分だと思います。

それでは、そのChapter 8 〜 10についてもう少し詳しく書きたいと思います。

Chapter 8 Basic Type Classes and Their Usage

Cats の構成を俯瞰的に解説していて、全体を把握するのに良いですね。instances、data、syntaxそれぞれのパッケージがどのような役割を持っているのかとか。型クラスのHierarchyとか。Monad、Applicative、Fuctor、Monoid、MonoidK、Traverseについての解説など、参考になりました。

Chapter 9 Libraries for Pure Functional Programming

Cats Effect を使用した並行プログラミングについて解説しています。その中で、FiberはMonadicフローにおいてIOの非同期処理の開始(start)、待ち合わせ(join)、キャンセル(cancel)を明示的に宣言するものであるとか、Bracketはリソースの開放をするものだとか。そして、Typelevel.scala の以下のライブラリを使用したWebAPIの実装例を紹介しています。

個々はそれほど深い内容ではないので、気になったら各ライブラリの公式サイトなどで学ぶと良さそう。

Chapter 10 Patterns of Advanced Functional Programming

関数型プログラミングをより便利に書くためのパターンとして、Monad TransformerやTagless Final、Heterogeneous List(HList)を解説しています。この内、Tagless Finalについて名前は知っていたものの、どのようなものなのか知らなかったので、学ぶ良い機会だったなと思います。

終わりに

Mastering Functional Programmingは、それほど濃い内容では無いものの、Catsを俯瞰して見ることができたり、doobieやhttp4sなど今まで触ったことの無いライブラリと出会えて良い刺激になりました。