@@ -4,36 +4,50 @@ module Class.MonadReader where
4
4
5
5
open import Meta.Prelude
6
6
7
- open import Class.Monad
7
+ open import Class.Core
8
8
open import Class.Functor
9
+ open import Class.Applicative
10
+ open import Class.Monad
9
11
open import Class.MonadError
10
12
11
13
open MonadError ⦃...⦄
12
14
13
- record MonadReader (R : Set ℓ) (M : ∀ {a} → Set a → Set a ) ⦃ _ : Monad M ⦄ : Setω where
15
+ record MonadReader (R : Set ℓ) (M : Type↑ ) ⦃ _ : Monad M ⦄ : Setω where
14
16
field
15
17
ask : M R
16
18
local : ∀ {a} {A : Set a} → (R → R) → M A → M A
17
19
18
20
reader : ∀ {a} {A : Set a} → (R → A) → M A
19
21
reader f = f <$> ask
20
- where instance _ = Functor-M
21
22
22
23
open MonadReader ⦃...⦄
23
24
24
25
ReaderT : (R : Set ) (M : ∀ {a} → Set a → Set a) → ∀ {a} → Set a → Set a
25
26
ReaderT R M A = R → M A
26
27
27
- module _ {R : Set } {M : ∀ {a} → Set a → Set a} ⦃ _ : Monad M ⦄ where
28
+ module _ {R : Set } {M : ∀ {a} → Set a → Set a} where
29
+
30
+ Functor-ReaderT : ⦃ Functor M ⦄ → Functor (ReaderT R M)
31
+ Functor-ReaderT ._<$>_ f ra r = f <$> ra r
32
+
33
+ instance _ = Functor-ReaderT
34
+
35
+ Applicative-ReaderT : ⦃ Applicative M ⦄ → Applicative (ReaderT R M)
36
+ Applicative-ReaderT .pure a = const (pure a)
37
+ Applicative-ReaderT ._<*>_ rf ra r = rf r <*> ra r
38
+
39
+ instance _ = Applicative-ReaderT
40
+
41
+ Monad-ReaderT : ⦃ Monad M ⦄ → Monad (ReaderT R M)
42
+ Monad-ReaderT .return a _ = return a
43
+ Monad-ReaderT ._>>=_ x f r = x r >>= flip f r
28
44
29
- Monad-ReaderT : Monad (ReaderT R M)
30
- Monad-ReaderT .return a = λ r → return a
31
- Monad-ReaderT ._>>=_ x f = λ r → x r >>= λ a → f a r
45
+ instance _ = Monad-ReaderT
32
46
33
- MonadReader-ReaderT : MonadReader R (ReaderT R M) ⦃ Monad-ReaderT ⦄
34
- MonadReader-ReaderT .ask = λ r → return r
47
+ MonadReader-ReaderT : ⦃ _ : Monad M ⦄ → MonadReader R (ReaderT R M)
48
+ MonadReader-ReaderT .ask r = return r
35
49
MonadReader-ReaderT .local f x = x ∘ f
36
50
37
51
MonadError-ReaderT : ∀ {e} {E : Set e} → ⦃ MonadError E M ⦄ → MonadError E (ReaderT R M)
38
- MonadError-ReaderT .error e = λ r → error e
39
- MonadError-ReaderT .catch x h = λ r → catch (x r) (λ e → h e r)
52
+ MonadError-ReaderT .error e _ = error e
53
+ MonadError-ReaderT .catch x h r = catch (x r) (flip h r)
0 commit comments