makoto-developer's テックブログ

#圏論 (8)

連載最終回。注文処理ワークフローを素直な手続き型と射の合成の両方で実装し、行数・アロケーション・レイテンシを測った。同じ機能なら1ステップあたり+30nsの追加コスト、9ステップ目から行数で得。同じ定義から実行・dry-run・Mermaid図・設定一覧の4つが導ける。そして正直に書く——型で進捗を保証することを諦めた場所、スタックトレースが深くなってステップ名が出なくなった場所、これはやりすぎだと判断した場所。

Functor から Applicative、Monad へ積み上げると、バリデーションのエラーが1件から3件に増える。式木を fold ひとつで畳んで評価・整形・簡約を書き分け、代数の積で木を1回だけたどる。iter.Seq が CPS 的な形をしていること、そして iter.Pull がスライス直走査の120倍遅いこと。最後に Go の天井——高階カインド多相の不在——を正面から測り、回避策3種のコストを比べる。

Goの標準ライブラリと日常のコードから Functor・Monoid・Kleisli合成・自然変換を取り出し、法則をテストで検証する。今回わかるのは「法則は最適化の許可証だ」ということ。ループ融合でメモリが半分以下、同じモノイドの実装差で55倍、並列畳み込みの損益分岐点は2〜3万要素。平均が並列化で壊れる様子と、その直し方も実演する。

圏論の解説はHaskell前提のものばかりで、Goを書く人には縁遠く見える。でも圏論が扱っているのは特定の言語機能じゃなく「合成」そのもの。第1回は、Goの型と関数が圏をなすことをproperty-based testで確かめ、純粋性が何を守っているのかを実際に壊して示し、合成のコストをベンチマークで測る。合成した関数は変数に入れて使い回せば手書きとの差が1ns未満と安く、呼ぶたびに組み直すと7倍以上遅い。

貼り合わせは曲がっていた。Painlevé I の交換子から Witt 代数が出て、整合条件には黄金比が刻まれている。変換の圏 C_max を建て、二十章分の主張を検証済み・修正・未解決に仕分けて現在地を確かめ、中心拡大を追う。一度は「無い」と証明し、次元を一つ上げた先でモジュライ上に c=1 の共形場理論が現れる。全7部の第5部(第1〜7章)。

Airy の接続公式で貼り合わせを検算し、機械精度で合ったところで最初の問いへの答えを宣言する。ところが直後の点検(Nevanlinna–Sokal の定理と自然境界)が存在問題を突き、宣言の適用範囲を自分で削ることになった。13桁一致の数値検証と、特異点の型を読む辞書の拡張まで。全7部の第4部(第1〜5章)。

「情報が深いところにある」と言うとき、その深さは測れるのか。量子系を実験台にして、測れる形の定義を作る。手で解ける最小模型 D=1+H₂(sin²θ)、Page曲線の読み替え、スクランブリング時間の再導出、そして深さの空間に Fisher 計量を入れて球面を見つけるところまで。全7部の第2部(第1〜4章)。

1+2+3+… が −1/12 になる。数学者が都合よく決めた値ではないと知ってもなお、なぜそれで嘘にならないのかが腑に落ちなかった。発散したのは値だけで構造は無傷なのではないか——この仮説から、情報不変量 I(S)、情報保存変換の七公理、完全情報予想までを手探りで組み立てる。全7部の第1部(第1〜3章)。