J

Martin Escardo, Paulo Oliva, originally 2023, with universes
generalized in March 2024.


{-# OPTIONS --safe --without-K #-}

open import MLTT.Spartan hiding (J)

module MonadOnTypes.J where

open import MonadOnTypes.Definition

𝕁 : 𝓦₀ ̇ → Monad {λ 𝓤 → 𝓦₀ ⊔ 𝓤}
𝕁 {𝓦₀} R = record {
 functor = λ X → (X → R) → X ;
 η       = λ x p → x ;
 ext     = λ f ε p → f (ε (λ x → p (f x p))) p ;
 ext-η   = λ ε → refl ;
 unit    = λ f x → refl ;
 assoc   = λ g f x → refl
 }

module J-definitions {R : 𝓦₀ ̇ } where

 J : 𝓤 ̇ → 𝓦₀ ⊔ 𝓤 ̇
 J = functor (𝕁 R)

 _⊗ᴶ_ : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ }
      → J X
      → ((x : X) → J (Y x))
      → J (Σ x ꞉ X , Y x)
 _⊗ᴶ_ = _⊗_ (𝕁 R)

 ⊗ᴶ-direct-definition : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ }
                        (ε : J X)
                        (δ : (x : X) → J (Y x))
                      → ε ⊗ᴶ δ ∼ (λ q → let
                                         ν  = λ x → δ x (curry q x)
                                         x₀ = ε (λ x → curry q x (ν x))
                                        in (x₀ , ν x₀))
 ⊗ᴶ-direct-definition ε δ q = refl

 ηᴶ : {X : 𝓤 ̇ } → X → J X
 ηᴶ = η (𝕁 R)

 extᴶ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → (X → J Y) → J X → J Y
 extᴶ = ext (𝕁 R)

 mapᴶ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → (X → Y) → J X → J Y
 mapᴶ = map (𝕁 R)


Added 16th June 2026. We have that J {R} X is a monad on X for the
outcome type R fixed. But it is also a contravariant functor on R for
the type X fixed, for which we use the letter O.


module contravariant-functoriality-on-outcome-type
        (X : 𝓤 ̇ )
       where

 O : 𝓥 ̇ → 𝓤 ⊔ 𝓥 ̇
 O R = functor (𝕁 R) X

 O-functor : {R : 𝓥 ̇ } {S : 𝓦 ̇ }
           → (S → R) → (O R → O S)
 O-functor f ε p = ε (f ∘ p)

 O-functor-id : {R : 𝓥 ̇ }
              → O-functor (𝑖𝑑 R) = (𝑖𝑑 (O R))
 O-functor-id = refl

 O-functor-∘
  : {R : 𝓥 ̇ } {S : 𝓦 ̇ } {T : 𝓣 ̇ }
    (f : R → S) (g : S → T)
  → O-functor (g ∘ f) = O-functor f ∘ O-functor g
 O-functor-∘ f g = refl