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

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

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

参照用 記事

モナドにおける「拡張」の補遺:アンクライスリ化かな

5月に「モナドにおける「拡張」とは何なのか? 色々と計算してみる」というエントリーを書いたのですが、それに少し補足をしておきます。「拡張」は、モナドモナド類似物を使うときにとても重要な概念だと思っているので、繰り返しを厭わないで書きます。

F = (F, η, μ) を圏C上のモナドとします。Fのクライスリ圏を K = Kl(C, F) としましょう。関手J:CKを次のように定義します。

  • X∈|C| に対して、J(X) = X (対象は同じ)
  • f:X→Y in C に対して、J(f) は f;ηY:X→F(Y) をK内で解釈した射

このJを、僕は「埋め込み関手」とか「クライスリ埋め込み」と呼ぶことが多いのですが、その理由は; モナドの単位ηがモノ変換(すべての成分がモノ射である自然変換)であるとき、JX,Y:C(X, Y)→K(X, Y) はホムセットのあいだの単射となります。したがって、Jは忠実関手であり、対象の上でJは恒等(identity on objects)なので、J:CK は圏の埋め込みとなります。

計算的モナド(computational monad)の場合、モナド単位がモノ変換である仮定を置くことが多いので、計算的に興味深いモナドではJが埋め込みだと言ってもいいでしょう。しかし、モナド単位がモノ変換でないときは埋め込みとは限らないので一般性には欠ける表現です。J(f)は、Cの射fのクライスリ圏における再解釈なので、fのクライスリ化とでも呼べばいいかもしれません。

さて、注目すべきはJの随伴です。J:CKモナドから作られた関手のとき、Jは右随伴を持ちます*1。というか、そもそもクライスリ構成は随伴対の構成が目的でした。Jの右随伴を「拡張」と呼んでいたのでした。でも、今上に述べた理由で、アンクライスリ化とか呼ぶのが適切な気がしてきました。EとかExtじゃなくてUとします*2。Uは次のように与えられます。

  • U(X) = F(X) (対象に対してはモナドの台関手Fと同じ)
  • k:X→Y in K に対して、k を k:X→F(Y) とみなした上で、U(k) := F(k);μY

この U:KC により、C(X, U(Y)) と K(J(X), Y) の同型が得られます。U(Y) = F(Y)、J(X) = X だったので、この同型は C(X, F(Y)) = K(X, Y) というクライスリ射の定義に戻ります。

プログラミング構成素としては、アンクライスリ化関手Uより、次のように定義されるU'のほうが便利なことがあります。

  • U'(k:X→Y) := ηX;U(k):X→F(Y)

U'は、Uよりさらに「クライスリ射の定義そのもの」です。「定義そのもの」である点=直接性がメリットです。しかし、U'は関手にはなりません。U'(k;h) = U'(k);U'(h) は成立しません。その代わり、U'(k;h) = U'(k);U(h) は成立します。実用上は主にU'を使って、必要に応じて関手性を持つUと組み合わせるのがよさそうです。

アンクライスリ化(今定義したUやU'、旧称「拡張」)の具体例を挙げると、例外処理を try {...} catch {...} の形に書いたとき、tryブロックは例外モナドに関するアンクライスリ化になっています。関手UではなくてU'のほうに対応します。tryブロックは、例外が起きるかもしれない計算=クライスリ圏の射をブロック内に閉じ込めています。ブロック全体としては、(特定された)例外は起きない計算=もとの圏の射と考えてよいことになります。

モナドは、例外に限らず不純な計算を定式化できるので、不純な計算=クライスリ圏の射を閉じ込めてもとの圏のなかに組み入れるために使えます。その背景は随伴なので、相対的に(あるいは随伴的に)、もとの圏をクライスリ圏に埋め込んで(計算概念を拡張して)全体の計算をクライスリ圏内で解釈しているとも考えられます。クライスリ化/アンクライスリ化が、もとの圏とクライスリ圏を行き来するために使えるのです。

いずれにしても、もとの圏Cとクライスリ圏Kでは結合も恒等射も違うので、ブロックの内外で異なる計算概念/計算方式を混ぜることになります。場合によって、非常の多くの計算概念/計算方式が登場することになります。そこで、大量のモナド類似物を取り扱う必要が生じます。インデキシングやファイブレーションの登場ですが、今日はこのへんにしておきます。

*1:Jが埋め込み関手のとき、右随伴関手を持つなら、もとの圏Cはクライスリ圏Kの余反映的部分圏になるかと思ったのですが、余反映的の定義には充満部分圏であることが条件でした。

*2:Uと書くと、忘却関手のような気もするが…