Skip to content

Commit 1a1aa2b

Browse files
committed
[ new ] Monotone predicate monads instances
Identity, Reader, Error, State
1 parent 96bdb4c commit 1a1aa2b

File tree

5 files changed

+172
-1
lines changed

5 files changed

+172
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,14 @@ Other minor additions
121121
record IsMagma (∙ : Op₂ A) : Set (a ⊔ ℓ)
122122
```
123123

124-
* Added new module `Category.Monad.Monotone`:
124+
* Added new modules `Category.Monad.Monotone(.*)`:
125125
```agda
126126
record RawMPMonad (M : Pt I ℓ) : Set (suc ℓ)
127+
Identity : Pt I i
128+
record Identity
129+
record ReaderMonad E (M : Pred I ℓ → Pt I ℓ) : Set (suc ℓ) where
130+
record ErrorMonad (M : Pt I ℓ) : Set (suc ℓ) where
131+
record StateMonad (M : Pt I ℓ) : Set (suc ℓ) where
127132
```
128133

129134
* Added new functions to `Codata.Colist`:
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
open import Relation.Binary hiding (_⇒_)
2+
3+
module Category.Monad.Monotone.Error {ℓ}(pre : Preorder ℓ ℓ ℓ)(Exc : Set ℓ) where
4+
5+
open import Function
6+
open import Level hiding (lift)
7+
open import Data.Sum
8+
9+
open import Relation.Unary
10+
open import Relation.Unary.Closure.Preorder pre
11+
open import Relation.Unary.PredicateTransformer
12+
13+
open import Category.Monad.Monotone pre
14+
open import Category.Monad.Monotone.Identity pre
15+
16+
open Preorder pre renaming (Carrier to I)
17+
18+
ErrorT : Pt I ℓ Pt I ℓ
19+
ErrorT M P = M (λ i Exc ⊎ P i)
20+
21+
Error = ErrorT Identity
22+
23+
record ErrorMonad (M : Pt I ℓ) : Set (suc ℓ) where
24+
field
25+
throw : {P i} Exc M P i
26+
try_catch_ : {P} M P ⊆ (□ (const Exc ⇒ M P)) ⇒ M P
27+
28+
module _ {M} (Mon : RawMPMonad M) where
29+
private module M = RawMPMonad Mon
30+
31+
open RawMPMonad
32+
errorT-monad : RawMPMonad (ErrorT M)
33+
return errorT-monad px = M.return (inj₂ px)
34+
_≥=_ errorT-monad px f =
35+
px M.≥= λ where
36+
v (inj₁ e) M.return (inj₁ e)
37+
v (inj₂ x) f v x
38+
39+
open ErrorMonad
40+
errorT-monad-ops : ErrorMonad (ErrorT M)
41+
throw errorT-monad-ops e = M.return (inj₁ e)
42+
try_catch_ errorT-monad-ops c f =
43+
c M.≥= λ where
44+
v (inj₁ e) f v e
45+
v (inj₂ x) M.return (inj₂ x)
46+
47+
lift-error : {P} M P ⊆ ErrorT M P
48+
lift-error x = x M.>>= (λ z M.return (inj₂ z))
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
open import Relation.Binary
2+
3+
module Category.Monad.Monotone.Identity {i}(pre : Preorder i i i) where
4+
5+
open Preorder pre renaming (Carrier to I)
6+
7+
open import Relation.Unary.PredicateTransformer using (Pt)
8+
open import Category.Monad.Monotone pre
9+
open RawMPMonad
10+
11+
Identity : Pt I i
12+
Identity = λ P i P i
13+
14+
id-monad : RawMPMonad Identity
15+
return id-monad px = px
16+
_≥=_ id-monad c f = f refl c
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
open import Relation.Binary using (Preorder)
2+
3+
module Category.Monad.Monotone.Reader {ℓ}(pre : Preorder ℓ ℓ ℓ) where
4+
5+
open import Function
6+
open import Level
7+
8+
open import Data.Product
9+
10+
open import Relation.Unary.PredicateTransformer using (Pt)
11+
open import Relation.Unary
12+
open import Relation.Unary.Closure.Preorder pre
13+
14+
open import Category.Monad
15+
open import Category.Monad.Monotone.Identity pre
16+
open import Category.Monad.Monotone pre
17+
18+
open Preorder pre renaming (Carrier to I)
19+
open Closed ⦃...⦄
20+
21+
ReaderT : Pred I ℓ Pt I ℓ Pt I ℓ
22+
ReaderT E M P = λ i E i M P i
23+
24+
Reader : (Pred I ℓ) Pt I ℓ
25+
Reader E = ReaderT E Identity
26+
27+
record ReaderMonad E (M : Pred I ℓ Pt I ℓ) : Set (suc ℓ) where
28+
field
29+
ask : {i} M E E i
30+
reader : {P} (E ⇒ P) ⊆ M E P
31+
local : {P E'} (E ⇒ E') ⊆ (M E' P ⇒ M E P)
32+
33+
asks : {A} (E ⇒ A) ⊆ M E A
34+
asks = reader
35+
36+
module _ {M : Pt I ℓ}(Mon : RawMPMonad M) where
37+
private module M = RawMPMonad Mon
38+
39+
module _ {E}⦃ _ : Closed E ⦄ where
40+
open RawMPMonad
41+
reader-monad : RawMPMonad (ReaderT E M)
42+
return reader-monad x e = M.return x
43+
_≥=_ reader-monad m f e =
44+
m e M.≥= λ
45+
i≤j px f i≤j px (next e i≤j)
46+
47+
open ReaderMonad
48+
reader-monad-ops : ReaderMonad E (λ E ReaderT E M)
49+
ask reader-monad-ops e = M.return e
50+
reader reader-monad-ops f e = M.return (f e)
51+
local reader-monad-ops f c e = c (f e)
52+
53+
lift-reader : {P} E M P ⊆ ReaderT E M P
54+
lift-reader _ z _ = z
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
open import Relation.Binary using (Preorder)
2+
3+
module Category.Monad.Monotone.State {ℓ}(pre : Preorder ℓ ℓ ℓ)
4+
(H : Preorder.Carrier pre Set ℓ)
5+
where
6+
7+
open Preorder pre renaming (Carrier to I)
8+
9+
open import Level
10+
open import Function
11+
open import Data.Product
12+
13+
open import Relation.Unary
14+
open import Relation.Unary.PredicateTransformer using (Pt)
15+
open import Relation.Unary.Closure.Preorder pre
16+
17+
open import Category.Monad
18+
open import Category.Monad.Monotone pre
19+
open import Category.Monad.Monotone.Identity pre
20+
21+
MST : (Set Set ℓ) Pt I ℓ
22+
MST M P = H ⇒ (λ i M (∃ λ j i ∼ j × H j × P j))
23+
24+
MSt : Pt I ℓ
25+
MSt = MST id
26+
27+
record StateMonad (M : Pt I ℓ) : Set (suc ℓ) where
28+
field
29+
runState : {P} □ (H ⇒ (H ∩ P)) ⊆ M P
30+
31+
get : {i} M H i
32+
get = runState λ _ μ μ , μ
33+
34+
module _ {M}(Mon : RawMonad {ℓ} M) where
35+
private module M = RawMonad Mon
36+
37+
open RawMPMonad
38+
mst-monad : RawMPMonad (MST M)
39+
return mst-monad px μ = M.return (_ , refl , μ , px)
40+
_≥=_ mst-monad c f μ = c μ M.>>= λ where
41+
(i₁ , ext₁ , μ₁ , pv) (f ext₁ pv μ₁) M.>>= λ where
42+
(i₂ , ext₂ , μ₂ , pw) M.return (i₂ , trans ext₁ ext₂ , μ₂ , pw)
43+
44+
open StateMonad
45+
mst-monad-ops : StateMonad (MST M)
46+
runState (mst-monad-ops) f μ =
47+
let (μ' , p) = f refl μ
48+
in M.return (_ , refl , μ' , p)

0 commit comments

Comments
 (0)