人気ブログランキング | 話題のタグを見る

単なる自己関手の圏における... (4) 随伴

モナドにたどり着くまでにクリアしなければならないのは、自然変換(natural transformation) と随伴 (adjunction) だ。随伴は、圏 X と 圏 A の関手を考える際に見られる構造だ。圏 X -> 圏 A の関手 F と、圏 A -> 圏 X の関手 G それに加えて F と G から導出される unit (η) および counit (ε) からなっている。圏 X と 圏 A の間の随伴は < F, G, η, ε > で表される。

随伴 を考える場合、関手 F や G は適当に決めることができるので、焦点は η や ε が存在するかどうかということになる。

今、圏 X について、整数の集合 C と C の関数からなっていると考える。また、圏 A は、整数一個からなるリスト(例えば、[1], [2], など) を要素とする集合 B とそれに関する関数からなっていると考える。圏 A の関数をさしあたって考えていないが、圏 X と 圏 A の関手 F のうち、対象関数をまず設定し、その関手によって圏 X から自然に写像される関数を採用することにする。

そこで、圏 X から、圏 A への関手 F の対象関数 ftrF を次のように定義する。

Prelude> let ftrF x = [x]

そうすると、この対象関数の定義から圏 X の関数 (\x -> x * 2) の圏 A の像は次のように定義できる。

Prelude> let g [x] = ftrF $ (\x -> x * 2) x
Prelude> g [2]
[4]

圏 A から圏 X への関手 G について、Fの逆関数となるようなものを選ぶのは自然だ。そこで、関手 G の対象関数 ftrG を次のように定義する。

Prelude> let ftrG [x] = x

そうすると自然に unit = G . F, counit = F . G を考えることができる。

Prelude> let unit = ftrG . ftrF
Prelude> let counit = ftrF . ftrG

そうすると、unit は集合Aの恒等関数になっているのが分かる。

Prelude> unit 5
5

したがって、unit と A の関数 f との合成関数 f . unit は f そのものになる。

Prelude> (succ . unit) 3
4
Prelude> succ 3
4

そうして、counit は集合 B の恒等関数である。

Prelude> counit [5]
[5]

counit と集合 B の関数 g との合成関数は、g そのものである。

Prelude> (g . counit) [3]
[6]
Prelude> g [3]
[6]

こうして、関手 ftrF x = [x] を定めることによって、めでたく unit と counit が導出され、随伴を作ることができた。

要するに、随伴とは適切な関手を選ぶことによって unit と counit を作り出す操作だった。


単なる自己関手の圏における... (5) モナドへ
by tnomura9 | 2011-10-10 18:45 | Haskell | Comments(7)
Commented by 通りすがり at 2013-09-08 15:41 x
随伴は難解な概念なので,こんなふうに単純化してもらえるのは大変ありがたいです.
ただ,ここの圏Xと圏Aの場合は,随伴というより,ふつうの「逆」ではないかと思うのですが・・・.
ここの圏Aとしては,通常は「整数一個からなるリスト・・・」ではなく,「いくつかの整数からなるリスト・・・」(いわゆる自由モノイド)をとると思いますが,その場合は,関手Gの対象関数は,ftrG [x] = x というような分かりやすいもの(ftrFの逆)にはなりませんね?こういう場合については,tnomuraさん流にはどう単純化して理解すればよいのでしょうか?
Commented by tnomura9 at 2013-09-08 18:09
通りすがりさん、コメント有難うございました。
記事の例では圏 X はただひとつのオブジェクト {x} をもち、圏 A はただひとつのオブジェクト {[x]} を持つものとしてモデルに取り上げました。このとき関手 F の対象関数は F x = [x]、関手 G の対象関数は G [x] = x を想定しています。問題は、自然変換 η :: I<sub>X</sub> -> GF をどのように Haskell の関数として表すかということですが、I<sub>X</sub> x = x、(G . F) x = x というところから単純に η = id となるのではと考えました。しかし、一般的には自然変換はオブジェクトの要素の添字つき関数のようですので、このような単純化が適切かどうかはわかりません。この例では対象関数 G は単に対象関数 F の inverse ですが、これは特殊な例だと思います。自然変換については、理解できている自信がないので、もう少し勉強したらこの記事は訂正が必要なのかもしれません。
この記事の意図は随伴<F, G, η, ε>でどのように関手 F から unit と counit が導出されるのかを漫画化してみたかったのです。
自然変換は圏論の中心概念のようですが、いまのところ、どこから取り付いたらよいかもわからない状態です。
Commented by 通りすがり at 2013-09-08 21:19 x
tnomuraさん,さっそく返答くださりありがとうございます.

> 漫画化・・・

圏論では,自然変換,随伴等々,まず抽象的な式が出てきて,それらが要するに何をしたいためのものかがわからないので,それを自分で想像しながら理解するのにいらいらしてしまいます.思い切った漫画化をしていただくと,たとえ正確でなくても何をしたいのかがつかみやすいので,期待しています.

> 自然変換は圏論の中心概念のようですが

そのようですが,これについても,通常の説明は,難しすぎるのではないかと思っています.本来もっと簡明な説明をしなければいけないのではないか? さらには,「自然」「変換」という用語も適切なのか?等々悶々としています(笑)
Commented by 通りすがり at 2013-09-15 10:58 x
> 要するに、随伴とは適切な関手を選ぶことによって unit と counit を作り出す操作だった。

ここを理解したいのですが~~
随伴とは「逆モドキ」のことだとすると,unitとcounitはそれぞれ何のことだと理解すればよいのでしょうか? たとえば,それは,「逆モドキ」を「逆」に見せるための調整である,とか.
上に示された例の場合の随伴は,はじめから「逆」でもあったので,unit, counit共,何もしなくて(恒等関数で)よかったのでしょうが.
Commented by tnomura9 at 2013-09-15 14:00
通りすがりさん、コメントありがとうございました。
圏 C と圏 D について関手 F :: C -> D と関手 G :: D -> C があって、FとGが写像でいう逆写像になるような物を随伴というのではないかと曖昧に考えていました。unit と counit はFとGから導きだされる自然変換で、関手FとGを代数の要素と見なしたときの演算子のような役割をするらしいです。これに何の意味があるのかは分かりませんが、モナドの理論で重要な役割をはたしているようです。私が圏論に首をつっこみはじめたのも単に Haskell のモナドとは何かが知りたいだけで、数学の構造をを記述するという本来の役割については荷が重い気がします。私の知っている数学的構造といったら、線形代数の初歩と群論の初歩と集合くらいしかないからです。したがって、ご質問にお答えする能力はないと思います。unit、counit については http://en.wikipedia.org/wiki/Adjoint_functors に簡単な説明があるようです。
Commented by 通りすがり at 2013-09-15 17:57 x
tnomuraさん.こんなに早くお答えくださりありがとうございます.恐縮です.

> FとGが写像でいう逆写像になるような物を随伴というのではないか

私もtnomuraさんに倣って?,随伴を「逆」として,あるいは「逆」を起点にして,少しでも身近なものとして理解したいと思いました.
逆とは違うようですが,では,逆となにが違うのか?逆のようで逆とは少し違うそんな中途半端な?ものをなぜ考えるのか?そんなものが有用なのはなぜなのか?等々.
でも,数式ばかりが多く,そういう説明はなかなか見当たりません.
ご紹介いただいたURLもこれから勉強してみます.
Commented by 通りすがり at 2013-09-15 20:55 x
私には,モナドもまた,それがなにをやりたいためのものか,一言では表しにくいものに見えます.関数と副作用の問題はそのうちの一つでしょうが,それとは異なる他の目的もいろいろと混じっているようですし.これについても「そのうち機会があれば」お話をきかせていただければうれしいです.
<< 単なる自己関手の圏における..... 単なる自己関手の圏における..... >>