モナドメモ - 圏論におけるモナドの定義
関数型言語Haskellで使用されているモナドの圏論における定義のメモ
準備
まず,圏の定義.
圏(Category)
圏Cは以下のものにより構成される.
- 対象のあつまりObj(C)
- 射のあつまりArr(C)
- 各々の射fについて,dom(f), cod(f)という対象が定義されている.dom(f) = A, cod(f) = B であるような射fをf : A → Bとも記述する.
- 任意のf : A → B, g : B → Cに対し g.f : A → Cが定義される
- 各対象Aに対し,idA : A → Aなる恒等射が存在.任意のf: A → Bに対し,idB.f = f, f . idA = fとなる
次に関手の定義
関手(Functor)
CとDとを関手とする.Cの対象AにDの対象F Aを割当て,Cの射 f : A → BにDの射 F f: F A → F Bを割当てる写像Fで以下の条件をみたすものを関手という.
- Cの任意の射f : A → B,g : B → Cに対し,F (g.f) = F g . F f.ここで,射の合成の意味がCとDで変化してよいことに注意
- Cの任意の対象Aに対し,F idA = idF A
そして自然変換の定義する.
自然変換(Natural Transformation)
関手F,G: C → Dを考える.Cの各対象Aに対し,Dの射μA: F A → G Aを割当て,Cの任意の射f: A → Bに対してG f. μA = μB . F fが成り立つような割当てをFからGへの自然変換という.
モナド
そして,モナド.
モナド
圏C上のモナドとは,次の性質を満たす3つ組(T, η, μ )である.
- T : C → Cな関手
- ηは,I からTへの自然変換(Iは恒等関手)
- μはT2からTへの自然変換
- μA . μT A = μA . T μA
- μA . ηT A = idT A
- μA . T ηA = idT A
ここで,T Cの対象から,Cの対象でありT Cの対象でないようなものへの自明な射は存在しないことに注意.
Haskellにて使用される,モナドと等価なKleisli Triple.
Kleisli Triple
圏C上のKeisli Tripleとは,次の性質を満たす3つ組(T, η, _*)である.
- T : Obj(C) → Obj(C)である写像
- ηA : A → T A という射
- f : A → T B に対しf* : T A → T B
- ηA* = idT A
- f* . ηA = f
- g* . f* = ( g* . f )*
最後のルールがbindの結合則,その上の2つがunitがidのように振舞うことをあらわしている.実際に次のようなKleisli圏を定義できる
Kleisli圏
圏C上のKleisli Triple(T, η, _*)に対して,以下のように構成することで圏Dをつくることができる.
- Dの対象はCの対象と同じ
- Dの射f : A → B は,Cの射 f : A → T B
- Dでの射の合成 g.f は,Cにおける g*.f
- Dでの恒等射 idAはCでの ηA
何のことはない.モナドとは関数合成に別の意味を与える世界だったのだ.