{-# OPTIONS --without-K --safe #-}
open import Categories.Category
open import Categories.Monad
module Categories.Category.Construction.EilenbergMoore {o ℓ e} {C : Category o ℓ e} (M : Monad C) where
open import Level
open import Categories.Morphism.Reasoning C
private
module C = Category C
module M = Monad M
open C
open M.F
open HomReasoning
record Module : Set (o ⊔ ℓ ⊔ e) where
field
A : Obj
action : F₀ A ⇒ A
commute : action ∘ F₁ action ≈ action ∘ M.μ.η A
identity : action ∘ M.η.η A ≈ C.id
record Module⇒ (X Y : Module) : Set (ℓ ⊔ e) where
private
module X = Module X
module Y = Module Y
field
arr : X.A ⇒ Y.A
commute : arr ∘ X.action ≈ Y.action ∘ F₁ arr
EilenbergMoore : Category (o ⊔ ℓ ⊔ e) (ℓ ⊔ e) e
EilenbergMoore = record
{ Obj = Module
; _⇒_ = Module⇒
; _≈_ = λ f g → Module⇒.arr f ≈ Module⇒.arr g
; id = record
{ arr = C.id
; commute = id-comm-sym ○ ∘-resp-≈ʳ (⟺ identity)
}
; _∘_ = compose
; assoc = assoc
; sym-assoc = sym-assoc
; identityˡ = identityˡ
; identityʳ = identityʳ
; identity² = identity²
; equiv = record
{ refl = refl
; sym = sym
; trans = trans
}
; ∘-resp-≈ = ∘-resp-≈
}
where
open Equiv
compose : ∀ {X Y Z} → Module⇒ Y Z → Module⇒ X Y → Module⇒ X Z
compose {X} {Y} {Z} f g = record
{ arr = f.arr ∘ g.arr
; commute = begin
(f.arr ∘ g.arr) ∘ Module.action X ≈⟨ pullʳ g.commute ⟩
f.arr ∘ Module.action Y ∘ F₁ g.arr ≈⟨ pullˡ f.commute ⟩
(Module.action Z ∘ F₁ f.arr) ∘ F₁ g.arr ≈˘⟨ pushʳ homomorphism ⟩
Module.action Z ∘ F₁ (f.arr ∘ g.arr) ∎
}
where module f = Module⇒ f
module g = Module⇒ g