圏の概略
圏のおおまかな定義
圏は本質的には次の3つのものを持つようなものをいう。
- Objectの集まり
- ふたつのObject(Source ObjectとTarget Object)を一つに結びつける射の集まり
fがAからBへの射であるとき、f : A -> B とかく
- 射の合成の定義
- hが射f, gの合成であるとき、h = f ○ g とかく
圏の例
圏Setはすべての集合をObjectとして持ち、射として関数、合成として関数合成を持つような圏である。
圏Grpはすべての群をObjectとして持ち、射として群演算を保存する関数(群準同型)を持つような圏である。
つまり、任意の2つの群G, Hについて、f(u*v) = f(u) . f(v)であることと、f : G -> H はGrpの射であることは同値である。
Category則
Category則を満たしていないと、いくらObjectや射を持っていても圏と呼ぶことはできない。
Category則は3つ存在する。
- 射の合成は結合的でなければならない
- f ○ (g ○ h) = (f ○ g) ○ h
- 圏は合成演算において閉じていなければならない
f : B -> C かつ g : A -> B ならば、h = f ○ g のような射h : A -> C がその圏に存在しなければならない
- 任意のObjectについて恒等射が存在しなければならない
任意の射g : A -> B について、g ○ idA = idB ○ g = g となるようなidA, idBが存在しなければならない
Hask圏
圏の考え方をHaskellに拡張するために、Hask圏というものを定義する。これは
- Haskellの型をObjectとする
- Haskellの関数を射とする
- 合成として関数合成(.)をとる
Hask圏がCategory則を満たしているかどうかは容易に確認できる。ただ注意するべきなのは、恒等射である。
Haskellにおける恒等射はid関数だが、このid関数は多相的である。つまり、定義域や値域として異なる型を取ることができる。
一方で、圏論における恒等射はSource ObjectとTarget Objectを指定して定義する。もっとも、Haskellにおける多相関数は型を明示することで単相にできるので、この違いはそれほど大きな問題を産まない。
Haskellにおける射の合成
Functor