内容紹介
コードで学ぶ、プログラマーのための圏論入門
〈本書のポイント〉
・C++とHaskellのコードを使って、圏論の概念を解説した
・数学書のような定理⇒証明の繰り返しではなく、プログラマーの慣れている技術書な解説とした
近年の並列・並行プログラミングにおける安全性確保では、共有可変状態に依存する設計の難しさが指摘されています。こうした課題への有力なアプローチの一つが関数型プログラミングであり、その背景として圏論(けんろん)が重要な役割を果たします。圏論は型理論やラムダ計算と並ぶ理論的基盤の一つです。
関心の高いプログラマーは、命令型言語に導入されたラムダ式などの関数型プログラミングのアプローチから関数型言語に興味をもったり、命令型と異なる関数型というパラダイムに対する関心をもったりするなかから関数型言語を学びます。そのなかの一部は、理論的背景となる圏論にも興味を持ちます.
しかし『ベーシック圏論』や『圏論の基礎』を前にして、数学的素養というハードルの高さを感じる読者も少なくありません。圏論は大学で学ぶような数学の一分野なのです。
本書は、数学書のような定理と証明の反復ではなく、プログラマーが親しみやすい技術書スタイルで圏論の核心を解説します。主要概念をC++とHaskellのコードで具体化し、Haskellについては未経験者にも配慮して段階的に説明します(ただし、C++の基礎文法の理解は前提とします)。
一般的な入門から、モナド/コモナド、カン拡張、豊穣圏、トポス、ローヴェア理論といった発展的話題まで、段階的に橋渡しします。これにより、関数型プログラミングの理解を深め、日々の設計・実装に新たな視点をもたらすことを目指します。
圏論に関心はあるものの数学的背景に不安がある方、関数型の理解を理論面から補強したいプログラマーに適した一冊です。
このような方におすすめ
◎関数型プログラミングから圏論に興味をもったものの、数学に強いわけではないプログラマー
◎関数型プログラミングの基礎となる圏論を学び、スキルアップを目指すプログラマー
目次
主要目次
日本語版に寄せて
序文
第1部
1 圏:合成の本質
2 型と関数
3 圏のさまざま
4 クライスリ圏
5 積と余積
6 シンプルな代数的データ型
7 関手
8 関手性
9 関数型
10 自然変換
第2部
11 宣言的プログラミング
12 極限と余極限
13 自由モノイド
14 表現可能関手
15 米田の補題
16 米田埋め込み
第3部
17 射こそすべて
18 随伴
19 自由/忘却随伴
20 モナド:プログラマーの定義
21 モナドと計算効果
22 圏論から見たモナド
23 コモナド
24 F-代数
25 モナドの代数
26 エンドとコエンド
27 カン拡張
28 豊穣圏
29 トポス
30 ローヴェア理論
31 モナド・モノイド・圏
付録・索引
謝辞
索引
詳細目次
日本語版に寄せて
序文
第1部
1 圏:合成の本質
1.1 関数としての射
1.2 合成の性質
1.3 合成はプログラミングの本質
1.4 課題
2 型と関数
2.1 型を必要とするのは誰か?
2.2 型は合成に関する
2.3 型とは何か?
2.4 なぜ数学モデルが必要なのか?
2.5 純粋関数と非純粋関数
2.6 型の例
2.7 課題
3 圏のさまざま
3.1 対象がない場合
3.2 有向グラフ
3.3 順序
3.4 集合としてのモノイド
3.5 圏としてのモノイド
3.6 課題
4 クライスリ圏
4.1 Writer圏
4.2 HaskellにおけるWriter
4.3 クライスリ圏
4.4 課題
5 積と余積
5.1 始対象
5.2 終対象
5.3 双対性
5.4 同型
5.5 積
5.6 余積
5.7 非対称性
5.8 課題
5.9 参考文献
6 シンプルな代数的データ型
6.1 直積型
6.2 レコード
6.3 直和型
6.4 型の代数
6.5 課題
7 関手
7.1 プログラミングにおける関手
7.1.1 Maybe関手
7.1.2 等式による推論
7.1.3 Optional
7.1.4 型クラス
7.1.5 C++における関手
7.1.6 リスト関手
7.1.7 Reader関手
7.2 コンテナーとしての関手
7.3 関手の合成
7.4 課題
8 関手性
8.1 双関手
8.2 積と余積の双関手
8.3 関手的代数的データ型
8.4 C++における関手
8.5 Writer関手
8.6 共変関手と反変関手
8.7 プロ関手
8.8 Hom関手
8.9 課題
9 関数型
9.1 普遍的構成
9.2 カリー化
9.3 冪
9.4 デカルト閉圏
9.5 冪と代数的データ型
9.5.1 0乗
9.5.2 1の冪乗
9.5.3 1乗
9.5.4 和による冪
9.5.5 冪の冪
9.5.6 積の冪
9.6 カリー・ハワード同型
9.7 参考文献
10 自然変換
10.1 多相関数
10.2 自然性を越えて
10.3 関手圏
10.4 2-圏
10.5 おわりに
10.6 課題
第2部
11 宣言的プログラミング
12 極限と余極限
12.1 自然同型としての極限
12.2 極限の例
12.3 余極限
12.4 連続性
12.5 課題
13 自由モノイド
13.1 Haskellにおける自由モノイド
13.2 自由モノイドの普遍的構成
13.3 課題
14 表現可能関手
14.1 Hom関手
14.2 表現可能関手
14.3 課題
14.4 参考文献
15 米田の補題
15.1 Haskellにおける米田の補題
15.2 余米田の補題
15.3 課題
15.4 参考文献
16 米田埋め込み
16.1 埋め込み
16.2 Haskellへの応用
16.3 前順序での例
16.4 自然性
16.5 課題
第3部
17 射こそすべて
17.1 関手
17.2 可換図式
17.3 自然変換
17.4 自然同型
17.5 Hom集合
17.6 Hom集合同型
17.7 Hom集合の非対称性
17.8 課題
18 随伴
18.1 随伴と単位/余単位ペア
18.2 随伴とhom集合
18.3 随伴に基づく積
18.4 随伴に基づく冪
18.5 課題
19 自由/忘却随伴
19.1 いくつかの直観
19.2 課題
20 モナド:プログラマーの定義
20.1 クライスリ圏
20.2 Fishの解剖
20.3 do記法
21 モナドと計算効果
21.1 問題
21.2 解決策
21.2.1 部分性
21.2.2 非決定性
21.2.3 読み取り専用の状態
21.2.4 書き込み専用の状態
21.2.5 状態
21.2.6 例外
21.2.7 継続
21.2.8 インタラクティブな入力
21.2.9 インタラクティブな出力
21.3 結論
22 圏論から見たモナド
22.1 モノイダル圏
22.2 モノイダル圏におけるモノイド
22.3 モノイドとしてのモナド
22.4 随伴に基づくモナド
23 コモナド
23.1 コモナドによるプログラミング
23.2 積コモナド
23.3 合成の分析
23.4 Streamコモナド
23.5 圏論から見たコモナド
23.6 Storeコモナド
23.7 課題
24 F-代数
24.1 再帰
24.2 F-代数の圏
24.3 自然数
24.4 Catamorphism
24.5 fold
24.6 余代数
24.7 課題
25 モナドの代数
25.1 T-代数
25.2 クライスリ圏
25.3 コモナドの余代数
25.4 レンズ
25.5 課題
26 エンドとコエンド
26.1 対角自然変換
26.2 エンド
26.3 等化子としてのエンド
26.4 エンドとしての自然変換
26.5 コエンド
26.6 忍者米田の補題
26.7 プロ関手の合成
27 カン拡張
27.1 右カン拡張
27.2 随伴としてのカン拡張
27.3 左カン拡張
27.4 エンドとしてのカン拡張
27.5 Haskellにおけるカン拡張
27.6 自由関手
28 豊穣圏
28.1 なぜモノイダル圏か?
28.2 モノイダル圏
28.3 豊穣圏
28.4 前順序
28.5 距離空間
28.6 豊穣関手
28.7 自己豊穣化
28.8 2-圏との関係
29 トポス
29.1 部分対象分類子
29.2 トポス
29.3 トポスと論理
29.4 課題
30 ローヴェア理論
30.1 普遍代数
30.2 ローヴェア理論
30.3 ローヴェア理論のモデル
30.4 モノイドの理論
30.5 ローヴェア理論とモナド
30.6 コエンドとしてのモナド
30.7 副作用のローヴェア理論
30.8 課題
30.9 参考文献
31 モナド・モノイド・圏
31.1 双圏
31.2 モナド
31.3 課題
31.4 参考文献
付録・索引
謝辞
索引
続きを見る