Skip to content

Commit aa1f0a3

Browse files
committed
feat: 1-category Monad(C)
1 parent 68ba831 commit aa1f0a3

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed

src/Cat/Instances/Monads.lagda.md

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
<!--
2+
```agda
3+
open import Cat.Instances.Product
4+
open import Cat.Functor.Compose
5+
open import Cat.Diagram.Monad
6+
open import Cat.Functor.Base
7+
open import Cat.Prelude
8+
9+
import Cat.Reasoning
10+
```
11+
-->
12+
13+
```agda
14+
module Cat.Instances.Monads where
15+
```
16+
17+
<!--
18+
```agda
19+
private variable
20+
o h : Level
21+
open Precategory
22+
open Functor
23+
```
24+
-->
25+
26+
# Categories of Monads {defines="category-of-monads"}
27+
28+
The **category of monads** of a category $\cC$ consists of [monads]
29+
on $\cC$ and natural transformations preserving the monadic structure.
30+
In terms of the bicategory of [monads in a bicategory], a morphism
31+
in the 1-categorical version always has the identity functor as its
32+
underlying 1-cell.
33+
34+
[monads in a bicategory]: Cat.Bi.Diagram.Monad.html
35+
36+
<!--
37+
```agda
38+
module _ {C : Precategory o h} where
39+
private
40+
module C = Cat.Reasoning C
41+
42+
Endo : Precategory (o ⊔ h) (o ⊔ h)
43+
Endo = Cat[ C , C ]
44+
module Endo = Cat.Reasoning Endo
45+
46+
Endo-∘-functor : Functor (Endo ×ᶜ Endo) Endo
47+
Endo-∘-functor = F∘-functor
48+
module Endo-∘ = Functor Endo-∘-functor
49+
```
50+
-->
51+
52+
A monad homomorphism is a natural transformation $\nu$ preserving
53+
the unit $\eta$ and the multiplication $\mu$; that is, the following
54+
two diagrams commute:
55+
56+
~~~{.quiver}
57+
\[\begin{tikzcd}
58+
{\id} && {\id} && {MM} && {NN} \\
59+
\\
60+
{M} && {N} && {M} && {N}
61+
\arrow["{\id}", from=1-1, to=1-3]
62+
\arrow["{\nu}"', from=3-1, to=3-3]
63+
\arrow["{\eta_M}"', from=1-1, to=3-1]
64+
\arrow["{\eta_N}", from=1-3, to=3-3]
65+
\arrow["{\nu\blacklozenge\nu}", from=1-5, to=1-7]
66+
\arrow["{\nu}"', from=3-5, to=3-7]
67+
\arrow["{\mu_M}"', from=1-5, to=3-5]
68+
\arrow["{\mu_N}", from=1-7, to=3-7]
69+
\end{tikzcd}\]
70+
~~~
71+
72+
```agda
73+
record Monad-hom (M N : Monad C) : Type (o ⊔ h) where
74+
no-eta-equality
75+
module M = Monad M
76+
module N = Monad N
77+
field
78+
nat : M.M => N.M
79+
open _=>_ nat public
80+
field
81+
pres-unit : nat ∘nt M.unit ≡ N.unit
82+
pres-mult : nat ∘nt M.mult ≡ N.mult ∘nt (nat ◆ nat)
83+
```
84+
85+
<!--
86+
```agda
87+
module _ {M N : Monad C} where
88+
private
89+
module M = Monad M
90+
module N = Monad N
91+
92+
Monad-hom-path
93+
: (ν ξ : Monad-hom M N)
94+
→ ν .Monad-hom.nat ≡ ξ .Monad-hom.nat
95+
→ ν ≡ ξ
96+
Monad-hom-path ν ξ p i .Monad-hom.nat = p i
97+
Monad-hom-path ν ξ p i .Monad-hom.pres-unit =
98+
is-prop→pathp
99+
(λ i → Nat-is-set (p i ∘nt M.unit) N.unit)
100+
(ν .Monad-hom.pres-unit)
101+
(ξ .Monad-hom.pres-unit)
102+
i
103+
Monad-hom-path ν ξ p i .Monad-hom.pres-mult =
104+
is-prop→pathp
105+
(λ i → Nat-is-set (p i ∘nt M.mult) (N.mult ∘nt (p i ◆ p i)))
106+
(ν .Monad-hom.pres-mult)
107+
(ξ .Monad-hom.pres-mult)
108+
i
109+
110+
abstract instance
111+
H-Level-Monad-hom : ∀ {n} → H-Level (Monad-hom M N) (2 + n)
112+
H-Level-Monad-hom = basic-instance 2 $ Iso→is-hlevel 2 eqv (hlevel 2)
113+
where unquoteDecl eqv = declare-record-iso eqv (quote Monad-hom)
114+
115+
instance
116+
Extensional-Monad-hom
117+
: ∀ {ℓ} ⦃ sa : Extensional (M.M => N.M) ℓ ⦄
118+
→ Extensional (Monad-hom M N) ℓ
119+
Extensional-Monad-hom ⦃ sa ⦄ =
120+
injection→extensional!
121+
{f = Monad-hom.nat}
122+
(Monad-hom-path _ _) sa
123+
124+
Funlike-Monad-hom
125+
: Funlike (Monad-hom M N) ⌞ C ⌟ (λ x → C .Hom (M.M # x) (N.M # x))
126+
Funlike-Monad-hom ._#_ = Monad-hom.η
127+
```
128+
-->
129+
130+
We have the identity and composition as expected.
131+
132+
```agda
133+
monad-hom-id : ∀ {M : Monad C} → Monad-hom M M
134+
monad-hom-id {M = _} .Monad-hom.nat = idnt
135+
monad-hom-id {M = _} .Monad-hom.pres-unit = Endo.idl _
136+
monad-hom-id {M = M} .Monad-hom.pres-mult =
137+
let module M = Monad M in
138+
idnt ∘nt M.mult ≡⟨ Endo.idl _ ⟩
139+
M.mult ≡˘⟨ Endo.idr _ ⟩
140+
M.mult ∘nt idnt ≡˘⟨ ap (M.mult ∘nt_) Endo-∘.F-id ⟩
141+
M.mult ∘nt (idnt ◆ idnt) ∎
142+
143+
monad-hom-∘
144+
: ∀ {M N O : Monad C}
145+
→ Monad-hom N O
146+
→ Monad-hom M N
147+
→ Monad-hom M O
148+
monad-hom-∘ {M = M} {N} {O} ν ξ = mh where
149+
module M = Monad M
150+
module N = Monad N
151+
module O = Monad O
152+
module ν = Monad-hom ν
153+
module ξ = Monad-hom ξ
154+
155+
mh : Monad-hom M O
156+
mh .Monad-hom.nat = ν.nat ∘nt ξ.nat
157+
mh .Monad-hom.pres-unit =
158+
(ν.nat ∘nt ξ.nat) ∘nt M.unit ≡˘⟨ Endo.assoc ν.nat ξ.nat M.unit ⟩
159+
ν.nat ∘nt (ξ.nat ∘nt M.unit) ≡⟨ ap (ν.nat ∘nt_) ξ.pres-unit ⟩
160+
ν.nat ∘nt N.unit ≡⟨ ν.pres-unit ⟩
161+
O.unit ∎
162+
mh .Monad-hom.pres-mult =
163+
(ν.nat ∘nt ξ.nat) ∘nt M.mult ≡˘⟨ Endo.assoc ν.nat ξ.nat M.mult ⟩
164+
ν.nat ∘nt (ξ.nat ∘nt M.mult) ≡⟨ ap (ν.nat ∘nt_) ξ.pres-mult ⟩
165+
ν.nat ∘nt (N.mult ∘nt (ξ.nat ◆ ξ.nat)) ≡⟨ Endo.assoc ν.nat N.mult (ξ.nat ◆ ξ.nat) ⟩
166+
(ν.nat ∘nt N.mult) ∘nt (ξ.nat ◆ ξ.nat) ≡⟨ ap (_∘nt (ξ.nat ◆ ξ.nat)) ν.pres-mult ⟩
167+
(O.mult ∘nt (ν.nat ◆ ν.nat)) ∘nt (ξ.nat ◆ ξ.nat) ≡˘⟨ Endo.assoc O.mult (ν.nat ◆ ν.nat) (ξ.nat ◆ ξ.nat) ⟩
168+
O.mult ∘nt ((ν.nat ◆ ν.nat) ∘nt (ξ.nat ◆ ξ.nat)) ≡˘⟨ ap (O.mult ∘nt_) $ Endo-∘.F-∘ (ν.nat , ν.nat) (ξ.nat , ξ.nat) ⟩
169+
O.mult ∘nt ((ν.nat ∘nt ξ.nat) ◆ (ν.nat ∘nt ξ.nat)) ∎
170+
```
171+
172+
Putting these together, we have the 1-category of monads.
173+
174+
```agda
175+
Monads : ∀ (C : Precategory o h) → Precategory (o ⊔ h) (o ⊔ h)
176+
Monads C .Ob = Monad C
177+
Monads C .Hom = Monad-hom
178+
Monads C .Hom-set _ _ = hlevel 2
179+
Monads C .id = monad-hom-id
180+
Monads C ._∘_ = monad-hom-∘
181+
Monads C .idr _ = ext λ _ → C .idr _
182+
Monads C .idl _ = ext λ _ → C .idl _
183+
Monads C .assoc _ _ _ = ext λ _ → C. assoc _ _ _
184+
```

0 commit comments

Comments
 (0)