直積スタンピング関手(掛け算関手)は簡単な関手ですが、驚くほど役に立ちます。コモノイド/モノイドをスタンピングする関手は、それぞれコモナド/モナドを定義します。コモナド/モナドは互いに双対です。その実例として「参照と更新の双対性」があります。さらに具体化して、データベース操作に関して述べるなら、次のような双対性があります。
参照 | 更新 | |
---|---|---|
DBを参照する | DBを更新する | |
クエリ | 更新リクエスト | |
クエリの実行 | 更新のコミット | |
クエリ結果の使い回し | 更新リクエストのキューイング | |
イミュータブルなスコープ | トランザクション |
更新操作がモナドを構成するのですが、ストレージ更新(書き込み)モナドとストレージ状態空間へのコミットは、線形代数(線型代数)と次の類似性を持ちます。
ストレージ更新 | 線形代数 |
---|---|
更新モナド | スカラー体 |
ストレージ | ベクトル空間 |
更新リクエスト | スカラー |
リクエストの連接 | スカラーどおしの乗法 |
コミット | ベクトルとスカラーの乗法 |
何もしない操作 | スカラーの 1 |
矛盾を引き起こすリクエスト | スカラーの 0 |
矛盾した(回復不可能な)状態 | ゼロベクトル |
もちろん、このような類似性は偶然やコジツケではありません。ハッキリとした背景があります。
これまで何度か触れたことですが(でもちゃんと説明してないのですが)、モノイド圏B(ベースのつもりでB)のなかでモノイド(B内のモノイド対象)を考えることができます。Bを色々変えると、さまざまなモノイド概念が出てきます。このことは、「圏、関手、モナドはどうしたら分かるの?」の最後のほうで少し述べています。
圏Cの自己関手の圏End(C)でモノイドを考えると、それはC上のモナドになり、アーベル群の圏Abでモノイドを考えると多元環(単に代数とも呼ばれる)になります。さらに、モノイド作用を考えると、End(C)ではモナドが作用する状態空間、Abでは多元環上の加群になります。スカラー体上のベクトル空間は多元環上の加群の特別な(そして重要な)事例なのです。なお、自己関手の圏End(C)については、「自己関手の圏とモナド」で簡単に説明しています。
上に挙げた表のなかで、最後の2行はゼロ(zero, annihilation)概念がないと定義できないので、モノイドの一般論からは出てきません。この例では、クラッシュして無意味になってしまったストレージの状態をゼロで表すことができます。似た例として、「プログラムの算術的計算法 (続き&完結)」では、ハングする文をゼロで表しました。
直積は極限の特別な場合、直和は余極限の特別な場合です。これから、直積と直和が双対なことがわかります。極限を使わない直積の定義として、演算(デカルトペアリング)の等式的な公理系もあります。双対をとれば(射の矢印を機械的に逆向きにすれば)直和の等式的な公理系が得られます。
直和と直積の双対性を特定の実例に適用すると、状態と例外の双対性が得られます。
状態 | 例外 |
---|---|
状態に依存する関数 | 例外を起こす関数 |
状態のセット(例:注入) | 例外の捕捉 |
状態の生成と初期化 | 例外のハンドル |
状態のダンプ | 例外のスロー |
状態を参照も変更もしない | 例外を捕捉しない |
状態のコピー | 例外の集約(同一視) |
この表の各欄に出てくる概念はお馴染みかもしれませんが、圏論なしでこのような双対性に気付くのは難しいでしょう。
双対性が面白いのは、双対な概念の定義が機械的な“ひっくり返し”に過ぎないのに、現象としてはまったく別物である点です(例:「対角コモノイド上の余加群と古典観測」)。片側の世界ではよく知られた簡単な概念なのに、双対の世界では未知の難しい概念だったりします。つまり、双対の世界に移ることにより、未知の難しい概念をよく知られた簡単な概念に帰着できる可能性があります。
今言った事情から(その他の理由からも)双対は役に立つのですが、仮に役に立たなくても、人間は、ペアや対称性が好きみたいです。双対性を見いだすだけでもけっこう楽しいと思いますよ。
エントリータイトルは、ボブ・クックの「物理系実務者のための圏論入門」に似せた(インスパイアされた)ものです :-)