Skip to content

Commit 56790e4

Browse files
Merge pull request #502 from agda/action-monad
Add Action monad
2 parents 081c9f6 + d01c300 commit 56790e4

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
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

Comments
 (0)