{-# OPTIONS --without-K --safe #-} open import Categories.Category module Categories.Monad.Duality {o ℓ e} (C : Category o ℓ e) where open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl) open import Categories.Functor.Core using (Functor) open import Categories.NaturalTransformation.Core using (NaturalTransformation) open import Categories.Monad open import Categories.Comonad private module C = Category C open C open HomReasoning coMonad⇒Comonad : Monad C.op → Comonad C coMonad⇒Comonad M = record { F = Functor.op F ; ε = NaturalTransformation.op η ; δ = NaturalTransformation.op μ ; assoc = M.sym-assoc ; sym-assoc = M.assoc ; identityˡ = M.identityˡ ; identityʳ = M.identityʳ } where module M = Monad M open M using (F; η; μ) Comonad⇒coMonad : Comonad C → Monad C.op Comonad⇒coMonad M = record { F = Functor.op F ; η = NaturalTransformation.op ε ; μ = NaturalTransformation.op δ ; assoc = M.sym-assoc ; sym-assoc = M.assoc ; identityˡ = M.identityˡ ; identityʳ = M.identityʳ } where module M = Comonad M open M using (F; ε; δ) module MonadDualityConversionProperties where private coMonad⇔Comonad : ∀ (coMonad : Monad C.op) → Comonad⇒coMonad (coMonad⇒Comonad coMonad) ≡ coMonad coMonad⇔Comonad _ = refl Comonad⇔coMonad : ∀ (M : Comonad C) → coMonad⇒Comonad (Comonad⇒coMonad M) ≡ M Comonad⇔coMonad _ = refl