|
| 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