{-# OPTIONS --without-K --safe #-} open import Categories.Category.Core open import Categories.Monad module Categories.Adjoint.Construction.EilenbergMoore {o ℓ e} {C : Category o ℓ e} (M : Monad C) where open import Categories.Category.Construction.EilenbergMoore M open import Categories.Adjoint open import Categories.Functor open import Categories.Functor.Properties open import Categories.NaturalTransformation.Core open import Categories.NaturalTransformation.NaturalIsomorphism using (_≃_) open import Categories.Morphism.Reasoning C private module C = Category C module M = Monad M open M.F open C open HomReasoning open Equiv Forgetful : Functor EilenbergMoore C Forgetful = record { F₀ = Module.A ; F₁ = Module⇒.arr ; identity = refl ; homomorphism = refl ; F-resp-≈ = λ eq → eq } Free : Functor C EilenbergMoore Free = record { F₀ = λ A → record { A = F₀ A ; action = M.μ.η A ; commute = M.assoc ; identity = M.identityʳ } ; F₁ = λ f → record { arr = F₁ f ; commute = ⟺ (M.μ.commute f) } ; identity = identity ; homomorphism = homomorphism ; F-resp-≈ = F-resp-≈ } FF≃F : Forgetful ∘F Free ≃ M.F FF≃F = record { F⇒G = record { η = λ _ → F₁ C.id ; commute = λ _ → [ M.F ]-resp-square id-comm-sym ; sym-commute = λ _ → [ M.F ]-resp-square id-comm } ; F⇐G = record { η = λ _ → F₁ C.id ; commute = λ _ → [ M.F ]-resp-square id-comm-sym ; sym-commute = λ _ → [ M.F ]-resp-square id-comm } ; iso = λ _ → record { isoˡ = elimˡ identity ○ identity ; isoʳ = elimˡ identity ○ identity } } Free⊣Forgetful : Free ⊣ Forgetful Free⊣Forgetful = record { unit = record { η = M.η.η ; commute = M.η.commute ; sym-commute = M.η.sym-commute } ; counit = record { η = λ X → let module X = Module X in record { arr = X.action ; commute = ⟺ X.commute } ; commute = λ f → ⟺ (Module⇒.commute f) ; sym-commute = Module⇒.commute } ; zig = M.identityˡ ; zag = λ {B} → Module.identity B }