このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

オプティックの絵図

オプティック〈optic | optics〉というプログラミングのデザインパターン(広義)があるらしい。僕は知らなかったのですが、「オプティックを勉強したい」という人達がいたので、ちょっとお付き合いしてみました。

オプティックで使う(かも知れない)絵図〈diagram | picture〉が出てきたのですが、初見ではなんだかワカラナイ。しばらく考えて、だいたいは分かったので、それをメモしておきます。他の記事への参照は脚注にあります。


絵図が出ていた論文は次です。これはドラフトらしく、ミスが散見します。しかし、おおよその考え方を知るためなら、些細な間違いは問題にはならないでしょう。

この論文に次のような絵が出てきます*1

ℓ = left、r = right の2つの部分があるのは、左パートと右パートがペアになっていることを示すだけなので、どちらか一方だけ考えれば十分です。左パートだけ取り出して時計回りに90度回転します(右パートでも同様に時計回り90度回転します)。

この形を解釈すればいいわけです。

まずは一般論から*2。圏Cのなかに 射 f:A → B in C があれば、それは次のように図示されます。

描画法はいつも僕が使っている方式で、射の方向は上から下、ノード形状はオダンゴです*3

この射 f in C を、圏の圏(2-圏)Cat または CAT *4へと格上げ〈promote | bump up〉*5します。

2-圏 CAT における描画法は、関手の方向は左から右、自然変換の縦結合方向が上から下です*6。上の絵のなかで:

次に、F:CC in CAT が自己関手〈endofunctor〉だとして、C 内で次のような射を考えます。

  • g:A → F(B) in C

それを格上げすると次のように描けます*7

絵では、関手は左から右に走り、結合〈合成〉や適用も左から右です。関手の図式順結合記号をスター '*'、対象・射を関手に渡す図式順適用記号をドット '.' とすると、次が成立します。

  • B~*F = (B.F)~ = F(B)~

この理由から、F(B) の格上げの図が B~ F の順序で描かれているのです。

さて、G:M → [C, C] in CAT という関手を考えましょう*8。ここで、[C, C] は圏の圏 CAT の内部ホム対象〈指数対象 | ベキ対象〉、つまり関手圏です。対象 X∈|M| に対して、G(M) はCの自己関手です。F := G(X) :CC in CAT として、先程の F を G(X) で置き換えると次の図になります。

G(X) を、青い関手シース〈functor sheath〉で心線〈芯線 | cable core〉X をくるんだ形で描いています。この描画法はストライプ図*9です。

最初に挙げたロマン〈Mario Roman〉の図(下に再掲)は、すぐ上の図と同じです。ワイヤーやエリア(平面内の領域)のラベルは省略されています。圏 C 内で描画しているわけではなくて、圏の圏 CAT 内で描画しています。絵図を見るときは、「どこで、何を、どのように描いているのか?」を最初に確認しないとワケワカランことになります。注意しましょう。

*1:実は絵しか見てません。

*2:絵の読み書きに関する一般的注意は「絵算をはじめた人への注意」参照。

*3:ノードは幾何的には点〈point〉です。広がりを持たせるのは、ラベルを記入したり形状で種別を表すためです。

*4:サイズ問題が気になるなら、小さい圏の圏 Cat を使ったほうがよいでしょう。

*5:圏論の随伴をちゃんと抑えよう: お絵描き完全解説 // 対象と射の格上げ」参照。

*6:描画法のバラエティは「絵算(ストリング図)における池袋駅問題の真相」参照。

*7:同様な描画法はクライスリ射の描画にも使います。

*8:オプティックの状況では、Gは圏論的作用(双関手)をカリー化した関手です。

*9:モノイド関手/ラックス・モノイド関手とその実例 // マッカーディのストライプ図」参照。ストライプ図を使った実例は「モノイド圏と加群圏に関するフォークロアとマックレーン五角形・三角形」。