open import Level open import Data.Product using (_,_) open import Categories.Category.Core open import Categories.Category.Cartesian open import Categories.Category.BinaryProducts open import Categories.Category.Cartesian.Monoidal open import Categories.Category.Product using () renaming (_⁂_ to _✢_) open import Categories.Monad hiding (id) open import Categories.Monad.Strong open import Categories.Functor renaming (id to idF) open import Categories.NaturalTransformation hiding (id) open import Categories.Object.Terminal using (Terminal) module Monad.Strong.Helper {o ℓ e} {C : Category o ℓ e} (cartesian : Cartesian C) where open Category C open Cartesian cartesian open BinaryProducts products hiding (η) open CartesianMonoidal cartesian using (monoidal) record ExtendsToStrongMonad (F : Endofunctor C) : Set (o ⊔ ℓ ⊔ e) where field η : NaturalTransformation idF F μ : NaturalTransformation (F ∘F F) F τ : NaturalTransformation (-×- ∘F (idF ✢ F)) (F ∘F -×-) module F = Functor F module η = NaturalTransformation η module μ = NaturalTransformation μ module τ = NaturalTransformation τ open F field assoc : ∀ {X : Obj} → μ.η X ∘ F₁ (μ.η X) ≈ μ.η X ∘ μ.η (F₀ X) sym-assoc : ∀ {X : Obj} → μ.η X ∘ μ.η (F₀ X) ≈ μ.η X ∘ F₁ (μ.η X) identityˡ : ∀ {X : Obj} → μ.η X ∘ F₁ (η.η X) ≈ id identityʳ : ∀ {X : Obj} → μ.η X ∘ η.η (F₀ X) ≈ id field τ-identityˡ : ∀ {A : Obj} → F₁ π₂ ∘ τ.η (Terminal.⊤ terminal , A) ≈ π₂ τ-η-comm : ∀ {A B : Obj} → τ.η (A , B) ∘ (id ⁂ η.η B) ≈ η.η (A × B) τ-μ-η-comm : ∀ {A B : Obj} → μ.η (A × B) ∘ F₁ (τ.η (A , B)) ∘ τ.η (A , F₀ B) ≈ τ.η (A , B) ∘ (id ⁂ μ.η B) τ-strength-assoc : ∀ {A B C : Obj} → F₁ assocˡ ∘ τ.η (A × B , C) ≈ τ.η (A , B × C) ∘ (id ⁂ τ.η (B , C)) ∘ assocˡ ExtendsToStrongMonad⇒StrongMonad : ∀ (F : Endofunctor C) → ExtendsToStrongMonad F → StrongMonad monoidal ExtendsToStrongMonad⇒StrongMonad F extends = record { M = record { F = F ; η = E.η ; μ = E.μ ; assoc = E.assoc ; sym-assoc = E.sym-assoc ; identityˡ = E.identityˡ ; identityʳ = E.identityʳ } ; strength = record { strengthen = E.τ ; identityˡ = E.τ-identityˡ ; η-comm = E.τ-η-comm ; μ-η-comm = E.τ-μ-η-comm ; strength-assoc = E.τ-strength-assoc } } where module E = ExtendsToStrongMonad extends record IsStrongMonadMorphism (M : StrongMonad monoidal) (N : StrongMonad monoidal) (α : NaturalTransformation (StrongMonad.M.F M) (StrongMonad.M.F N)) : Set (o ⊔ ℓ ⊔ e) where private module α = NaturalTransformation α module M = Monad (StrongMonad.M M) module N = Monad (StrongMonad.M N) open Strength (StrongMonad.strength M) using () renaming (strengthen to τ₁) open Strength (StrongMonad.strength N) using () renaming (strengthen to τ₂) field respects-η : ∀ {X : Obj} → α.η X ∘ M.η.η X ≈ N.η.η X respects-μ : ∀ {X : Obj} → α.η X ∘ M.μ.η X ≈ N.μ.η X ∘ α.η (N.F.₀ X) ∘ M.F.₁ (α.η X) respects-τ : ∀ {X Y : Obj} → α.η (X × Y) ∘ τ₁.η (X , Y) ≈ τ₂.η (X , Y) ∘ (id ⁂ α.η Y)