195 lines
No EOL
6.8 KiB
Agda
195 lines
No EOL
6.8 KiB
Agda
module Monads-Sets where
|
||
|
||
open import Level
|
||
open import Categories.Category.Instance.Sets
|
||
open import Categories.Category
|
||
open import Categories.Monad
|
||
open import Categories.Category.Cartesian
|
||
open import Categories.Category.CartesianClosed.Canonical
|
||
open import Categories.Category.BinaryProducts
|
||
open import Categories.Object.Exponential
|
||
open import Categories.Object.Product
|
||
open import Categories.Object.Terminal
|
||
open import Categories.Functor renaming (id to idF)
|
||
open import Categories.Category.Cocartesian
|
||
open import Categories.NaturalTransformation renaming (id to idN)
|
||
open import Data.Unit.Polymorphic
|
||
open import Data.Empty.Polymorphic
|
||
open import Data.Product
|
||
open import Data.Product.Properties using (×-≡,≡↔≡)
|
||
open import Data.Sum
|
||
open import Data.Sum.Properties
|
||
open import Function.Base renaming (_∘_ to _∘f_)
|
||
open import Axiom.Extensionality.Propositional
|
||
import Relation.Binary.PropositionalEquality as Eq
|
||
open Eq using (_≡_; refl; trans; sym; cong; cong-app; subst)
|
||
|
||
module _ (o ℓ e : Level) (ext : Extensionality o o) where
|
||
|
||
-- helpers
|
||
,-resp-≡ : ∀ {ℓ : Level} {A B : Set ℓ} {p₁@(a₁ , b₁) p₂@(a₂ , b₂) : A × B} → (a₁ ≡ a₂ × b₁ ≡ b₂) → p₁ ≡ p₂
|
||
,-resp-≡ (refl , refl) = refl
|
||
inj₁-resp-≡ : ∀ {ℓ} {A B : Set ℓ} {c1 c2 : A} → (c1 ≡ c2) → (inj₁ {B = B} c1 ≡ inj₁ {B = B} c2)
|
||
inj₁-resp-≡ refl = refl
|
||
inj₂-resp-≡ : ∀ {ℓ} {A B : Set ℓ} {c1 c2 : B} → (c1 ≡ c2) → (inj₂ {A = A} c1 ≡ inj₂ {A = A} c2)
|
||
inj₂-resp-≡ refl = refl
|
||
|
||
--*
|
||
-- Sets is cartesian(closed) and cocartesian
|
||
--*
|
||
|
||
SetsCartesian : Cartesian (Sets o)
|
||
SetsCartesian = record
|
||
{ terminal = record
|
||
{ ⊤ = ⊤
|
||
; ⊤-is-terminal = record
|
||
{ ! = λ {A} _ → tt
|
||
; !-unique = λ f → refl
|
||
}
|
||
}
|
||
; products = record
|
||
{ product = λ {A} {B} → record
|
||
{ A×B = A × B
|
||
; π₁ = proj₁
|
||
; π₂ = proj₂
|
||
; ⟨_,_⟩ = <_,_>
|
||
; project₁ = refl
|
||
; project₂ = refl
|
||
; unique = λ p1 p2 → sym (,-resp-≡ (p1 , p2))
|
||
}
|
||
}
|
||
}
|
||
|
||
SetsCocartesian : Cocartesian (Sets o)
|
||
SetsCocartesian = record
|
||
{ initial = record
|
||
{ ⊥ = ⊥
|
||
; ⊥-is-initial = record
|
||
{ ! = ⊥-elim
|
||
; !-unique = λ {A} f {x} → ⊥-elim {Whatever = λ y → ⊥-elim y ≡ f y} x
|
||
}
|
||
}
|
||
; coproducts = record
|
||
{ coproduct = λ {A} {B} → record
|
||
{ A+B = A ⊎ B
|
||
; i₁ = inj₁
|
||
; i₂ = inj₂
|
||
; [_,_] = [_,_]
|
||
; inject₁ = refl
|
||
; inject₂ = refl
|
||
; unique = λ p1 p2 → λ where
|
||
{inj₁ x} → sym $ p1 {x}
|
||
{inj₂ x} → sym $ p2 {x}
|
||
}
|
||
}
|
||
}
|
||
|
||
SetsCCC : CartesianClosed (Sets o)
|
||
SetsCCC = record
|
||
{ ⊤ = ⊤
|
||
; _×_ = _×_
|
||
; ! = !
|
||
; π₁ = π₁
|
||
; π₂ = π₂
|
||
; ⟨_,_⟩ = ⟨_,_⟩
|
||
; !-unique = !-unique
|
||
; π₁-comp = λ {_ _ f _ g} → project₁ {h = f} {g}
|
||
; π₂-comp = λ {_ _ f _ g} → project₂ {h = f} {g}
|
||
; ⟨,⟩-unique = λ {_ _ _ f g h} → unique {h = h} {f} {g}
|
||
; _^_ = λ X Y → Y → X
|
||
; eval = λ {X Y} (f , y) → f y
|
||
; curry = λ {C A B} f c a → f (c ,′ a)
|
||
; eval-comp = λ {A} {B} {C} {f} {x} → refl
|
||
; curry-unique = λ {A} {B} {C} {f} {g} fg {x} → ext λ y → fg
|
||
}
|
||
where
|
||
open Category (Sets o)
|
||
open Cartesian SetsCartesian
|
||
open HomReasoning
|
||
--open BinaryProducts products renaming (_×_ to _×'_; ⟨_,_⟩ to ⟨_,_⟩'; π₁ to π₁'; π₂ to π₂')
|
||
open Terminal terminal using (!; !-unique)
|
||
open BinaryProducts products using (π₁; π₂; ⟨_,_⟩; project₁; project₂; unique)
|
||
|
||
--*
|
||
-- ExceptionMonad TX = X + E
|
||
--*
|
||
|
||
ExceptionMonad : Set o → Monad (Sets o)
|
||
ExceptionMonad E = record
|
||
{ F = F
|
||
; η = η'
|
||
; μ = μ'
|
||
; assoc = λ {X} → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
; sym-assoc = λ {X} → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
; identityˡ = λ {X} → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
; identityʳ = λ {X} → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
}
|
||
where
|
||
open Cocartesian (SetsCocartesian) using (_+_; _+₁_)
|
||
F = record
|
||
{ F₀ = λ X → X + E
|
||
; F₁ = λ f → f +₁ id
|
||
; identity = λ {A} → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
; homomorphism = λ {X} {Y} {Z} {f} {g} → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
; F-resp-≈ = λ {A} {B} {f} {g} f≈g → λ where
|
||
{inj₁ x} → inj₁-resp-≡ (f≈g {x})
|
||
{inj₂ x} → refl
|
||
}
|
||
η' = ntHelper record
|
||
{ η = λ X → inj₁
|
||
; commute = λ {X} {Y} f {x} → refl
|
||
}
|
||
μ' = ntHelper record
|
||
{ η = λ X → [ id , inj₂ ]
|
||
; commute = λ {X} {Y} f → λ where
|
||
{inj₁ x} → refl
|
||
{inj₂ x} → refl
|
||
}
|
||
|
||
MaybeMonad : Monad (Sets o)
|
||
MaybeMonad = ExceptionMonad ⊤
|
||
|
||
--*
|
||
-- Reader Monad TX = X^S
|
||
--*
|
||
|
||
ReaderMonad : Set o → Monad (Sets o)
|
||
ReaderMonad S = record
|
||
{ F = F
|
||
; η = η'
|
||
; μ = μ'
|
||
; assoc = refl
|
||
; sym-assoc = refl
|
||
; identityˡ = refl
|
||
; identityʳ = refl
|
||
}
|
||
where
|
||
open Cocartesian (SetsCocartesian) using (_+_; _+₁_)
|
||
open CartesianClosed SetsCCC
|
||
F = record
|
||
{ F₀ = λ X → X ^ S
|
||
; F₁ = λ f g s → f (g s)
|
||
; identity = λ {A} {x} → refl
|
||
; homomorphism = λ {X Y Z f g x} → refl
|
||
; F-resp-≈ = λ {A B f g} fg {x} → ext λ y → fg {x y}
|
||
}
|
||
η' = ntHelper record
|
||
{ η = λ X → const
|
||
; commute = λ {X Y} f {x} → refl
|
||
}
|
||
μ' = ntHelper record
|
||
{ η = λ X x s → x s s
|
||
; commute = λ {X Y} f {x} → refl
|
||
} |