Functional Programming Strategies in Scala with Cats 日本語版
最近(多分2024年2月頃から)、Scala with Cats を読もうとすると『Functional Programming Strategies』という書籍ページが表示されます。これは Scala with Cats の著者(のひとり)である Noel さんがかれこれ3年ほど前から書き進めているものです。Scala with Cats の第二版のような位置付けでもあるかもしれませんが、大幅に加筆されてほぼ別の本になっています。2025年5月現在まだ執筆中で、執筆と並行して和訳を行っています。
関数型プログラミング戦略(Functional Programming Strategies)というのは、日本語で戦略というとやや違和感がないでもないですが、関数型プログラミングにおいて繰り返し現れる抽象的なパターンのことで、オブジェクト指向でいうところのデザインパターンみたいなものです。
Scala with Cats も、モナドやファンクターといった概念をそういうパターンとみなして紹介していたわけですが、Cats で型クラスとして実現されているものだけにフォーカスしていました。この新しい書籍は、たとえば代数的データ型や Tagless Final みたいなものもパターンのひとつとして、幅広いトピックを紹介しています。
こういったトピックをひとつひとつ丁寧に掘り下げている本は、自分は他に知りません。関数型プログラミングに興味があるなら、是非読んでみるとよいと思います。
現時点での目次を、以下にざっと並べておきます。
- 関数型プログラミング戦略
1.1. コードを考えるための三つのレベル
1.2. 関数型プログラミング - 代数的データ型
2.1. 代数的データ型の構築
2.2. Scala における代数的データ型
2.3. 構造的再帰
2.4. 構造的余再帰
2.5. 代数的データ型における代数
2.6. まとめ - 余データとしてのオブジェクト
3.1. データと余データ
3.2. Scala における余データ
3.3. 余データの構造的再帰と余再帰
3.4. データと余データの関係
3.5. データと余データの拡張性
3.6. 演習: さまざまな集合
3.7. まとめ - コンテキスト抽象化
4.1. コンテキスト抽象化のメカニズム
4.2. 型クラスの仕組み
4.3. 型クラスの合成
4.4. 型クラスとは何か
4.5. 演習: 表示ライブラリ
4.6. 型クラスと変位
4.7. まとめ - インタープリタ
5.1. 正規表現
5.2. インタープリタとレイフィケーション
5.3. 末尾再帰インタープリタ
5.4. まとめ - Cats を使う
6.1. クイックスタート
6.2. Cats を使う
6.3. 例題: Eq - モノイドと半群
7.1. モノイドの定義
7.2. 半群の定義
7.3. Cats におけるモノイド
7.4. モノイドの応用
7.5. まとめ - ファンクター
8.1. ファンクターの例
8.2. さまざまなファンクター
8.3. ファンクターの定義
8.4. 補足: 高カインド型と型コンストラクタ
8.5. Cats におけるファンクター
8.6. 反変ファンクターと非変ファンクター
8.7. Cats の Contravariant と Invariant
8.8. 補足: 部分的ユニフィケーション
8.9. まとめ - モナド
9.1. モナドとは何か
9.2. Cats におけるモナド
9.3. Identity モナド
9.4. Either
9.5. 補足: エラーハンドリングと MonadError
9.6. Eval モナド
9.7. Writer モナド
9.8. Reader モナド
9.9. State モナド
9.10. 独自のモナドを定義する
9.11. まとめ - モナド変換子
10.1. 演習: モナドの合成
10.2. 変換の例
10.3. Cats におけるモナド変換子
10.4. 演習: モナド戦士、トランスフォーム、出動!
10.5. まとめ - Semigroupal と Applicative
11.1. Semigroupal
11.2. apply 構文
11.3. さまざまな型に対する Semigroupal
11.4. Parallel
11.5. Apply と Applicative
11.6. まとめ - Foldable と Traverse
12.1. Foldable
12.2. Traverse
12.3. まとめ - インデックス付き型
13.1. ファントム型
13.2. インデックス付き余データ
13.3. インデックス付きデータ
13.4. まとめ - Tagless Final インタープリタ
14.1. 余データ的インタープリタ
14.2. Tagless Final インタープリタ
14.3. 代数的ユーザインターフェース
14.4. よりよいエンコーディング
14.5. まとめ - インタープリタとコンパイラの最適化
15.1. 代数的操作
15.2. 継続からスタックへ
15.3. コンパイラと仮想マシン
15.4. インタープリタからスタックマシンへ
15.5. まとめ - Creating Usable Code
- ケーススタディ: 非同期処理のテスト
17.1. 型コンストラクタの抽象化
17.2. モナドの抽象化
17.3. まとめ - ケーススタディ: MapReduce
18.1. 並列化された map と fold
18.2. foldMap の実装
18.3. foldMap の並列化
18.4. まとめ - Case Study: Data Validation
19.1. Sketching the Library Structure
19.2. The Check Datatype
19.3. Basic Combinators
19.4. Transforming Data
19.5. Kleislis
19.6. Summary - Case Study: CRDTs
20.1. Eventual Consistency
20.2. The GCounter
20.3. Generalisation
20.4. Abstracting GCounter to a Type Class
20.5. Abstracting a Key Value Store
20.6. Summary