|
| 1 | +-- The monad of actions of a monoid in a monoidal category |
| 2 | +-- See https://ncatlab.org/nlab/show/action+monad |
| 3 | + |
| 4 | +-- With the Cartesian monoidal structure on Sets or Setoids, this gives us the |
| 5 | +-- Writer monad familiar from Haskell. With the Cocartesian monoidal structure, |
| 6 | +-- noting that all objects in that monoidal category are monoids in a unique |
| 7 | +-- way, this gives us the Either monad. |
| 8 | + |
| 9 | +{-# OPTIONS --safe --without-K #-} |
| 10 | + |
| 11 | +open import Categories.Category.Core using (Category) |
| 12 | +open import Categories.Category.Monoidal.Core using (Monoidal) |
| 13 | + |
| 14 | +module Categories.Monad.Construction.Action {o ℓ e} {C : Category o ℓ e} (CM : Monoidal C) where |
| 15 | + |
| 16 | +open import Categories.Category.Monoidal.Properties CM using (coherence-inv₁) |
| 17 | +open import Categories.Category.Monoidal.Reasoning CM |
| 18 | +open import Categories.Category.Monoidal.Utilities CM using (module Shorthands; pentagon-inv; triangle-inv) |
| 19 | +open import Categories.Monad using (Monad) |
| 20 | +open import Categories.Monad.Morphism using (Monad⇒-id) |
| 21 | +open import Categories.Morphism.Reasoning C |
| 22 | +open import Categories.NaturalTransformation using (ntHelper) |
| 23 | +open import Categories.Functor using (Endofunctor; Functor) |
| 24 | +open import Categories.Functor.Bifunctor.Properties using ([_]-commute; [_]-decompose₁) |
| 25 | +open import Categories.Functor.Properties using ([_]-resp-∘; [_]-resp-square; [_]-resp-inverse) |
| 26 | +open import Categories.Object.Monoid CM using (Monoid; Monoid⇒) |
| 27 | +open import Function.Base using (_$_) |
| 28 | + |
| 29 | +open Category C |
| 30 | +open Monoidal CM |
| 31 | +open Shorthands |
| 32 | + |
| 33 | +module _ (m : Monoid) where |
| 34 | + |
| 35 | + private |
| 36 | + module m = Monoid m |
| 37 | + |
| 38 | + ActionF : Endofunctor C |
| 39 | + ActionF = m.Carrier ⊗- |
| 40 | + |
| 41 | + private |
| 42 | + module A = Functor ActionF |
| 43 | + |
| 44 | + η : ∀ X → X ⇒ A.₀ X |
| 45 | + η _ = m.η ⊗₁ id ∘ λ⇐ |
| 46 | + |
| 47 | + η-commute : ∀ {X Y} (f : X ⇒ Y) → η Y ∘ f ≈ A.₁ f ∘ η X |
| 48 | + η-commute f = glue (Equiv.sym [ ⊗ ]-commute) unitorˡ-commute-to |
| 49 | + |
| 50 | + μ : ∀ X → A.₀ (A.₀ X) ⇒ A.₀ X |
| 51 | + μ _ = m.μ ⊗₁ id ∘ α⇐ |
| 52 | + |
| 53 | + μ-commute : ∀ {X Y} (f : X ⇒ Y) → μ Y ∘ A.₁ (A.₁ f) ≈ A.₁ f ∘ μ X |
| 54 | + μ-commute f = glue (Equiv.sym [ ⊗ ]-commute) (assoc-commute-to ○ ∘-resp-≈ˡ (⊗-resp-≈ˡ ⊗.identity)) |
| 55 | + |
| 56 | + μ-assoc : ∀ {X} → μ X ∘ A.₁ (μ X) ≈ μ X ∘ μ (A.₀ X) |
| 57 | + μ-assoc = begin |
| 58 | + (m.μ ⊗₁ id ∘ α⇐) ∘ id ⊗₁ (m.μ ⊗₁ id ∘ α⇐) ≈⟨ refl⟩∘⟨ Functor.homomorphism (_ ⊗-) ⟩ |
| 59 | + (m.μ ⊗₁ id ∘ α⇐) ∘ (id ⊗₁ (m.μ ⊗₁ id) ∘ id ⊗₁ α⇐) ≈⟨ extend² assoc-commute-to ⟩ |
| 60 | + (m.μ ⊗₁ id ∘ (id ⊗₁ m.μ) ⊗₁ id) ∘ (α⇐ ∘ id ⊗₁ α⇐) ≈⟨ [ -⊗ _ ]-resp-square (switch-fromtoʳ associator (assoc ○ Equiv.sym m.assoc)) ⟩∘⟨refl ⟩ |
| 61 | + ((m.μ ∘ m.μ ⊗₁ id) ⊗₁ id ∘ α⇐ ⊗₁ id) ∘ (α⇐ ∘ id ⊗₁ α⇐) ≈⟨ pullʳ (sym-assoc ○ pentagon-inv) ⟩ |
| 62 | + (m.μ ∘ m.μ ⊗₁ id) ⊗₁ id ∘ (α⇐ ∘ α⇐) ≈⟨ Functor.homomorphism (-⊗ _) ⟩∘⟨refl ⟩ |
| 63 | + (m.μ ⊗₁ id ∘ (m.μ ⊗₁ id) ⊗₁ id) ∘ (α⇐ ∘ α⇐) ≈⟨ extend² (Equiv.sym assoc-commute-to ○ ∘-resp-≈ʳ (⊗-resp-≈ʳ ⊗.identity)) ⟩ |
| 64 | + (m.μ ⊗₁ id ∘ α⇐) ∘ (m.μ ⊗₁ id ∘ α⇐) ∎ |
| 65 | + |
| 66 | + μ-identityˡ : ∀ {X} → μ X ∘ A.₁ (η X) ≈ id |
| 67 | + μ-identityˡ = begin |
| 68 | + (m.μ ⊗₁ id ∘ α⇐) ∘ id ⊗₁ (m.η ⊗₁ id ∘ λ⇐) ≈⟨ refl⟩∘⟨ Functor.homomorphism (_ ⊗-) ⟩ |
| 69 | + (m.μ ⊗₁ id ∘ α⇐) ∘ (id ⊗₁ (m.η ⊗₁ id) ∘ id ⊗₁ λ⇐) ≈⟨ extend² assoc-commute-to ⟩ |
| 70 | + (m.μ ⊗₁ id ∘ (id ⊗₁ m.η) ⊗₁ id) ∘ (α⇐ ∘ id ⊗₁ λ⇐) ≈⟨ [ -⊗ _ ]-resp-∘ (Equiv.sym m.identityʳ) ⟩∘⟨ triangle-inv ⟩ |
| 71 | + ρ⇒ ⊗₁ id ∘ ρ⇐ ⊗₁ id ≈⟨ [ -⊗ _ ]-resp-inverse unitorʳ.isoʳ ⟩ |
| 72 | + id ∎ |
| 73 | + |
| 74 | + μ-identityʳ : ∀ {X} → μ X ∘ η (A.₀ X) ≈ id |
| 75 | + μ-identityʳ = begin |
| 76 | + (m.μ ⊗₁ id ∘ α⇐) ∘ (m.η ⊗₁ id ∘ λ⇐) ≈⟨ extend² (∘-resp-≈ʳ (⊗-resp-≈ʳ (Equiv.sym ⊗.identity)) ○ assoc-commute-to) ⟩ |
| 77 | + (m.μ ⊗₁ id ∘ (m.η ⊗₁ id) ⊗₁ id) ∘ (α⇐ ∘ λ⇐) ≈⟨ [ -⊗ _ ]-resp-∘ (Equiv.sym m.identityˡ) ⟩∘⟨ coherence-inv₁ ⟩ |
| 78 | + λ⇒ ⊗₁ id ∘ λ⇐ ⊗₁ id ≈⟨ [ -⊗ _ ]-resp-inverse unitorˡ.isoʳ ⟩ |
| 79 | + id ∎ |
| 80 | + |
| 81 | + ActionM : Monad C |
| 82 | + ActionM = record |
| 83 | + { F = ActionF |
| 84 | + ; η = ntHelper record |
| 85 | + { η = η |
| 86 | + ; commute = η-commute |
| 87 | + } |
| 88 | + ; μ = ntHelper record |
| 89 | + { η = μ |
| 90 | + ; commute = μ-commute |
| 91 | + } |
| 92 | + ; assoc = μ-assoc |
| 93 | + ; sym-assoc = Equiv.sym μ-assoc |
| 94 | + ; identityˡ = μ-identityˡ |
| 95 | + ; identityʳ = μ-identityʳ |
| 96 | + } |
| 97 | + |
| 98 | +-- a monoid morphism induces a monad morphism |
| 99 | +Monoid⇒-Monad⇒ : ∀ {m n} → Monoid⇒ m n → Monad⇒-id (ActionM n) (ActionM m) |
| 100 | +Monoid⇒-Monad⇒ {m} {n} f = record |
| 101 | + { α = ntHelper record |
| 102 | + { η = λ _ → arr ⊗₁ id |
| 103 | + ; commute = λ _ → Equiv.sym [ ⊗ ]-commute |
| 104 | + } |
| 105 | + ; unit-comp = pullˡ ([ -⊗ _ ]-resp-∘ preserves-η) |
| 106 | + ; mult-comp = begin |
| 107 | + arr ⊗₁ id ∘ m.μ ⊗₁ id ∘ α⇐ ≈⟨ extendʳ ([ -⊗ _ ]-resp-square preserves-μ) ⟩ |
| 108 | + n.μ ⊗₁ id ∘ (arr ⊗₁ arr) ⊗₁ id ∘ α⇐ ≈⟨ pullʳ assoc-commute-to ⟨ |
| 109 | + (n.μ ⊗₁ id ∘ α⇐) ∘ arr ⊗₁ (arr ⊗₁ id) ≈⟨ refl⟩∘⟨ [ ⊗ ]-decompose₁ ⟩ |
| 110 | + (n.μ ⊗₁ id ∘ α⇐) ∘ arr ⊗₁ id ∘ id ⊗₁ (arr ⊗₁ id) ∎ |
| 111 | + } |
| 112 | + where |
| 113 | + module m = Monoid m |
| 114 | + module n = Monoid n |
| 115 | + open Monoid⇒ f |
0 commit comments