圏論

圏論が気になって仕方がない。Haskellをやり始めなかったら、言葉も知らなかったと思うのだが、IOモナドをきちんと理解しようと思うとやはり圏論の知識が必要なのではないかと思った。

ネットで検索した圏の定義は次のようなものだ。

「対象」とよばれるモノ( = 数学的な対象 )のクラスと対象 X から Yへの
「射(morphism)」とよばれる要素からなる集合 Hom(X, Y) が指定されていて、f ∈ Hom(X, Y)
と g ∈ Hom(Y, Z) に対してはその「合成」とよばれる射 gf が定められていて、以下の3条件を
満たしているときこれらの総合概念 C を 圏(category)とよぶ。

 (Cat 1) 射の合成は結合法則 h(gf) = (hg)f をみたす.
 (Cat 2) 任意の対象 X に対して ∃ε∈Hom(X, X) ∀f∈Hom(X, Y)∀g∈ Hom(Z, X), fε=f, εg=g
 (Cat 3) 対象のペア (X, Y), (X', Y') が異なる ⇒ Hom(X, Y) ∩ Hom(X', Y') = φ

とりつくしまもない。

抽象的なものを抽象的なまま理解するのは特殊な能力が必要だろう。一般人は、何か具体例がないと理解出来ない。そこで、要素1だけを含む集合XにX->Xの写像f(x)=xを考えてみた。明らかにf(1)=1で、要素は1だけしかないので、f(x)の値も1しかとらない。

この集合X={1}、とf(x) = x の組み合わせはどうも圏になるようだ。上の定義に当てはめると、対象はXで、対象Xから対象Xへの写像 f(x)=x は射であるということになる。X->Xへの射を全て集めたものが、Hom(X,Y)だが、X->Xの写像はf しかないから、Hom(X,X)={f}だ。また、関数fについてはその合成関数ffを、ff(x) = f(f(x)) = f(x) = x のように定義できるから合成ffが存在することがわかる。

したがって、f(ff) = (ff)f は、f(ff)(x)= f(ff(x))=f(f(f(x)))=f(f(x))=f(x)=x のように展開することで簡単に結合法則を満たすことを証明できる。

また、e=f と読み替えると、ef(x) = e(x) = x = f(x) = f(e(x)) = fe(x) だから、ef = f = fe となる。また、全てのHom(X,X) は f ひとつしかないので全ての f ∈Hom(X,X)について、e が単位元であることがわかる。

したがって、集合{X}とf:X->X の組は圏であることがわかる。

関手については次のように定義されている。

圏 C の対象 X に圏 D の対象 F(X), 圏 C の射 f:X → Y に圏 D の射 F(f):F(X) → F(Y)
を対応させる(クラス間の)写像 F が

 (F1) F(gf) = F(g)F(f)
 (F2) F(1X) = 1F(X)

を満たしているとき F を C から D への 共変関手(covariant functor)
もしくは単に 関手 とよび F:C → D と書く。
C から D への関手の全体を Hom(C, D) で表す。
共変関手の双対として 反変関手(contravariant functor)が定義される。

そこで圏Cに{1} とf(x)=x からなる圏をとり、圏Dに {2} とg(x) = x からなる圏をとる。するとF(1) = 2、F(f) = g となる関手Fを考えることができる。対象の関数Fと射の関数Fは同じ名前だが違う関数だ。すると、ff(x)=f(f(x))=f(x) から、ff=f なので、F(ff)= F(f) である。また、gg(x)=g(g(x))=g(x) なので、gg=g つまり、F(f)F(f) = F(f)となるから、F(ff) = F(f)F(f) となり、関手によって射の合成が保存されるのがわかる。F2の単位元の性質も関手によって変更されないことがわかる。

従って、圏Cは、関手Fによって、その性質を変えないで圏Dへ写像されることがわかる。

これでなんとなく圏や関手の意味がわかったような気がする(かもしれない)。
[PR]
by tnomura9 | 2010-10-24 19:06 | 考えるということ | Comments(0)
<< 圏論とIOモナド Windows に Haske... >>