monad
triple
圈$ \bf C上の恆等函手を$ 1_{\bf C}と書く。圈$ \bf C上の monad とは自己函手$ T:{\bf C}\to{\bf C}と自然變換$ \eta:1_{\bf C}\Rarr T,$ \mu:(T;T)\Rarr Tの組$ (T,\eta,\mu)であり、以下の可換圖式 (coherence 條件) を滿たす $ (T\mu);\mu=(\mu T);\mu。但し$ T\muとは各對象$ x\in|{\bf C}|に就いて自然變換$ \muの成分$ \mu_xを函手$ Tに依って移した射$ T(\mu_x)を成分とした自然變換であり、$ \mu Tとは各對象$ x\in|{\bf C}|に就いて自然變換$ \muの對象$ T(x)に於ける成分$ \mu_{T(x)}を成分とした自然變換である $ T;T;T\to_{T\mu}T;T\to_\mu T,
$ T;T;T\to_{\mu T}T;T\to_\mu T.
$ (T\eta);\mu=(\eta T);\mu=1_T。但し$ 1_Tは函手$ T上の恆等自然變換 $ T\to_{\eta T}T;T\to_\mu T,
$ T\to_{T\eta}T;T\to_\mu T,
$ T\to_{1_T}T.
隨伴 (函手)との關係。或る monad は何らかの隨伴對$ F\dashv Gを合成した自己函手$ F;Gから成る。この分解は一般に一意ではない モナドの隨伴系への分解の全體は圈をなす
クライスリ圈による分解(以下、クライスリ分解〈Kleisli resolution〉とアイレンベルク/ムーア圈による分解(以下、アイレンベルク/ムーア分解〈Eilenberg-Moore resolution〉)は、何か特殊な地位を占めてゐる印象がありますが、モナドTの分解の圈 Resol(T) のなかで、ぞれぞれ始對象、終對象になっています。 Kleisli 圈
隨伴對$ F\dashv Gの合成$ F;Gは monad を構成する 自明な2-圈から2-圈CATへのラックス2-函手である
半順序$ (P,\le)から生成される圈(對象が$ Pの元であり、$ x\le yが成り立つとき$ xから$ yへ射が1つ與へられる)を特別に考へると、隨伴の對は Galois 接續(en:Galois connection)、monad は閉包作用素(en:closure operator)といふ單純な對應が取れる。 しかし、函數型プログラミングの文脈におけるモナドは通常は圏論における強モナドを指すことが多い。
Kleisli triple
code:unit と bind に依る定義.hs
unit :: x -> M x
bind :: M x -> (x -> M y) -> M y
-- 律
bind (unit x) f == f x
bind m unit == m
bind (bind m f) g == bind m (\x -> bind (f x) g)
unit と bind に依る定義は do 構文糖にとって自然
code:unit と fmap と join に依る定義.hs
unit :: x -> M x
fmap :: (x -> y) -> M x -> M y
join :: M (M x) -> M x
-- 律
fmap id == id
fmap (f . g) == (fmap f) . (fmap g)
unit . f == fmap f . unit
join . fmap join == join . join
join . fmap unit == join . unit
join . fmap (fmap f) == fmap f . join
code:bind と (fmap, join) との關係.hs
fmap f m == bind m (unit . f)
join m == bind m id
bind m g == join (fmap g m)