「Haskellの二重コロン「::」とバインド記号「>>=」の説明」で、拡張スタイルのモナドとモノイド・スタイルのモナドの話題が出ました。この話題はだいぶ昔に書いたことがありますが、絵算の応用として「拡張スタイル ←→ モノイド・スタイル」の相互変換をしてみます。
内容:
- 絵算の技法
- モノイド・スタイルのモナドの定義
- 拡張スタイルのモナドの定義
- モノイド・スタイルから拡張スタイルへ
- 拡張スタイルからモノイド・スタイルへ 素材の準備
- 拡張スタイルからモノイド・スタイルへ 法則の証明
- おわりに
絵算の技法
モナドの二種類の定義を行ったり来たりする、つまり「拡張スタイルのモナド ←→ モノイド・スタイルのモナド」の相互変換をするために、次の技法を使いましょう。
- 圏の圏における絵算〈{graphical | pictorial | diagrammatic} {calculation | computation}〉
- 図式順記法〈diagrammatic order notation〉
- 射の格上げ〈bump up | promotion〉
- オペレーターボックス〈operator box〉
これらの技法を使う実例としてモナドの定義を扱う、と言ったほうがいいかも知れません。この記事は絵算の練習問題と捉えましょう。
絵算、図式順記法、格上げについては、次の記事と、そこから参照されている記事を見てください。
オペレーターボックスは、関手ボックスを、関手とは限らないオペレーター〈コンビネータ〉にまで拡大して利用する手法です。アイディアは関手ボックスと同じです。関手ボックスについては、「絵算のススメ 2015 年末版 // 絵算のテクニック もっと:等号ノード、関手ボックス」で触れています(触れてるだけだな)。ストライプ図は関手ボックスの変種です -- 「モノイド関手/ラックス・モノイド関手とその実例 // マッカーディのストライプ図」に説明があります。
射のプロファイルとin記法もよく使うので、必要があれば次も参照してください。
モノイド・スタイルのモナドの定義
テキスト記法は図式順記法を使うので、必要があれば演算子記号の一覧表を確認してください。
モノイド・スタイルのモナドを (F, μ, η)/C と書いたとき、基礎となる圏Cと3つの構成素は(必ずしも小さくない)圏の圏CAT内で次のプロファイルを持ちます。
- C in CAT (基礎圏)
- F:C → C in CAT (台関手)
- μ::F*F ⇒ F:C → C in CAT (乗法)
- η::C^ ⇒ F:C → C in CAT (単位)(C^ は IdC と同じ)
モノイド・スタイルのモナド法則は次の等式で書けます。
- assoc ::: μ*F^ ; μ = F^*μ ; μ :: F*F*F ⇒ F : C → C in CAT (結合律)
- lunit ::: η*F^ ; μ = F :: C^*F ⇒ F : C → C in CAT (左単位律)
- runit ::: F^*η ; μ = F :: F*C^ ⇒ F : C → C in CAT (右単位律)
左単位律、右単位律における左右の別は書き方・描き方に依存するので左右に絶対的意味はありません。
CATは2-圏〈厳密2-圏〉ですが、等式は2-圏の3-射です*1。次のように書いたほうが3-射であることが伝わるでしょう。
- assoc ::: μ*F^ ; μ ≡> F^*μ ; μ :: F*F*F ⇒ F : C → C in CAT
等式=3-射は、ストリング図の変形として表現されます。モナド法則(結合律と2つの単位律)がどのような変形かは後で出てくるので、絵は省略します。
拡張スタイルのモナドの定義
拡張スタイルのモナドを (T, η, (-)#)/C とします。Cは圏ですが、Tは関手ではないし、ηの自然性も仮定せず、(-)# は関手でも自然変換でもないオペレーターです。(-)# をExtとも書くことにします。T, η, Ext は、次のような形で定義します。
- For A∈|C|, T(A) in C (対象構成子*2)
- For A∈|C|, ηA:A → T(A) in C (単位)
- For A, B∈|C|, ExtA,B:C(A, T(B)) → C(T(A), T(B)) in Set (拡張オペレーター)
次の方針で図示します。描画方向は、縦結合が上から下、横結合が左から右です。
- T(A) を図式順で A.T と書いて、A T の順で横に並んだ2本のワイヤーにする。
- ηA を図式順で A.ηと書いて、A η の順で横に並んだワイヤーとノードにする。ηのノード形状は三角('△')にする。
- f;A → T(B) に対する f# = ExtA,B(f) は、fを表すノード&ワイヤーを囲むボックスで描く。
上段の絵では、エリア、ワイヤー、ノードにすべてラベルを付けています。
- エリア☆は、自明圏(単一対象と恒等射だけの圏)
- エリアCは、基礎圏
- ワイヤーAは、Cの対象の格上げ
- ワイヤーTは、対象構成子〈型構成子〉(関手ではないが、関手の対象パートになる)
- ノードηは、左に対象(の格上げ)があると射(の格上げ)になる射の族
- ノードfは、Cの射 f:A → B in C の格上げ
- 箱は、Extを表すオペレーターボックス
下段の絵では、ラベルがほぼ省略されています。実際の計算では、この程度の省略が行われます。
注意すべきは、この描画法は「正面からではなくて横から見て描いている」ことです。横が何を意味するかというと、「絵算をはじめた人への注意 // 3次元ビュー」のBさんからの視点です。通常の関手ボックスやストライプ図は正面(Aさん)から見ての絵です。
さて、拡張スタイルのモナド法則は次の等式で書けます。A, B, C は基礎圏Cの対象で、図式順記法を使います。
- A.η ; (f:A → B.T)# = (f:A → B.T)
- (A.η:A → A.T)# = (A.T)^ ((A.T)^ は idA.T と同じ)
- [(f:A → B.T);(g:B → C.T)#]# = (f:A → B.T)#;(g:B → C.T)#
それぞれの等式は次のように図示されます。格上げを使って、絵はCAT内で解釈します。
絵の印象から、3つの等式をそれぞれ、
- 外単位律〈outer unit law〉
- 内単位律〈inner unit law〉
- 入れ子律〈nest law〉
と呼ぶことにします。
- ボックスの右上に接合された単位(△)はボックスごと消せる。
- ボックスに入れられた単位(△)はボックスごと消せる。
- ボックスの入れ子を、並んだ2個のボックスに変形できる。
逆向きの変形もできます。
モノイド・スタイルから拡張スタイルへ
モノイド・スタイルのモナド (F, μ, η)/C の構成素は次の方針で図示します。
- F:C → C はワイヤーで描く。
- μ::F*F ⇒ F は黒丸(●)で描く。
- η::C^ ⇒ F は三角(△)で描く。
与えられたモノイド・スタイルのモナド (F, μ, η)/C から、拡張スタイルのモナド (T, η, (-)#)/C を構成するには、次のように定義します。
- A.T := A.F
- A.η := A.η
- (f:A → B.T)# := (f:A → B.T).F ; B.μ
この定義のもとで、拡張スタイルのモナド法則(外単位律、内単位律、入れ子律)を示せばいいのですが、図の変形として比較的容易に示せます。
赤で描いているのは、モノイド・スタイルのモナドの右単位律、左単位律、結合律による変形です。(結合律による変形に、交替律によるノードの移動も混じってしまってますね。絵算あるある*3。)
拡張スタイルからモノイド・スタイルへ 素材の準備
与えられた拡張スタイルのモナド (T, η, (-)#)/C から、モノイド・スタイルのモナド (F, μ, η)/C を構成するには、まずFを次のように定義します。
- A.F := A.T (Fの対象パート)
- (f:A → B).F := [(f:A → B) ; B.η]# (Fの射パート)
Fの射パートは、実線のワイヤーではなくて波線(グニグニ)にします*4。対象パートは F = T なので実線のままです。
定義したFが関手であることは証明する必要があります。関手性は次のとおりです。
- (f;g).F = f.F ; g.F (結合の保存)
- A^.F = (A.F)^ (恒等射の保存)
絵算で示しましょう。
絵の変形に使っているのは、F(波線)の定義、入れ子律、外単位律、内単位律です。
ηはそのまま使いますが、拡張スタイルのηでは自然性を仮定してなかったので、自然性の証明が必要です。(下の図式で、あえて対象にはT、射にはFを使っています。)
ストリング図における自然性は、エレベータ法則になります。以下のように示せます。
モノイド・スタイルのモナド乗法μは次のように定義します。
- A.μ := [(A.T)^]# (対象に対しては T = F)
「定義されたモナド乗法」であることを強調するために、二重丸にしました。
μの自然性も証明が必要です。
絵算でエレベータ法則を示します。使うのは(当然ながら)、μの定義、F(射パート)の定義、拡張スタイルのモナド法則だけです。
拡張スタイルからモノイド・スタイルへ 法則の証明
拡張スタイルのモナド (T, η, (-)#)/C から構成された F, μ, η からなるモノイド・スタイルのモナド (F, μ, η)/C が、結合法則、右単位律、左単位律を満たすことを示す必要があります。それを示せれば、構成された (F, μ, η)/C は間違いなくモノイド・スタイルのモナドになります。
モノイド・スタイルのモナド法則は次のように示せます。煩雑になるので(それとめんどうなので)、ラベルは省略してますが、ラベルを補って解読してみてください。
おわりに
モノイド・スタイルはモノイドと同様に扱えるので、モナドの代数的な扱いには有利です。拡張スタイルはプログラミングではよく使われているし、モナド法則の証明がモノイド・スタイルより容易になる場合があります。それぞれ一長一短があるので、どちらか一方だけというわけにはいきません。
モノイド・スタイルと拡張スタイルは、可逆な翻訳で行き来できるという意味で同値です。この記事で、その同値性が成立することを実際に確認しました*5。細部まで観測することにより、両方のスタイルの定義が非常に巧みにできてるなーと感得できたのではないでしょうか。