Skip to content

Commit 098be49

Browse files
committed
implement ask with new ReaderP
1 parent 8d6dc2c commit 098be49

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

LeanEffectsContainer/Prog.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,19 @@ def bindN
104104
(scp := fun ⟨c, k⟩ => ProgN.scp c k)
105105
ma
106106

107+
def bindN'
108+
{n : Nat}
109+
(ma : ProgN effs α (n + 1))
110+
(k : α → ProgN effs β (n + 1)) :
111+
ProgN effs β (n + 1) :=
112+
foldP
113+
(P := fun _ => ProgN effs β (n + 1))
114+
(var0 := k)
115+
(varS := id)
116+
(op := fun ⟨c, k⟩ => ProgN.op c k)
117+
(scp := fun ⟨c, k⟩ => ProgN.scp c (ProgN.varS ∘ k))
118+
ma
119+
107120
def bind : Prog effs α → (α → Prog effs β) → Prog effs β :=
108121
bindN
109122

@@ -119,6 +132,10 @@ def Prog.run {α : Type u} : Prog [] α → α :=
119132
(op := fun ⟨c, _⟩ => nomatch c)
120133
(scp := fun ⟨c, _⟩ => nomatch c)
121134

135+
def Prog.mapU {α : Type u} {β : Type v} {effs : List Effect}
136+
(f : α → β) (p : Prog effs α) : Prog effs β :=
137+
p.bind (Prog.var ∘ f)
138+
122139
instance {effs : List Effect} : Monad (Prog effs) where
123140
pure := Prog.var
124141
bind := Prog.bind

LeanEffectsContainer/Reader.lean

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ section SmartConstructor
4343
variable
4444
[Reader S ∈ effs]
4545

46-
def tmp (p : ProgN effs (Prog effs α) 1) : ProgN effs α 2 := sorry
46+
-- def tmp (p : ProgN effs (Prog effs α) 1) : ProgN effs α 2 := sorry
4747

4848
def ask : Prog effs S :=
4949
opEff (e:=Reader S) ⟨ReaderOps.askOp, fun s => Prog.var s⟩
@@ -55,14 +55,14 @@ def ask : Prog effs S :=
5555
end SmartConstructor
5656

5757
-- {n : Nat} → ReaderP effs S α n → S → ProgN effs (ReaderP effs S α n) (n + 1)
58-
def run'
59-
(p : Prog (Reader S :: effs) (ULift α)) :
58+
def runL
59+
(p : Prog (Reader S :: effs) α) :
6060
S → Prog effs (ULift α) :=
6161
Prog.foldP
6262
(effs:=Reader S :: effs)
6363
(n:=1)
6464
(P := fun n => ReaderP effs S α n)
65-
(var0 := id)
65+
(var0 := ULift.up)
6666
(varS := by
6767
intro n p
6868
simp [ReaderP]; intro s
@@ -90,44 +90,43 @@ def run'
9090
| .inl x => nomatch x
9191
| .inr op' => by
9292
simp [ReaderP]; intro s
93-
apply ProgN.scp
94-
intro resp
9593
simp [ReaderP, Reader] at k
9694
rw [pos_scps_inr] at k
97-
sorry
98-
-- apply ProgN.varS
99-
-- apply k
100-
-- exact ((fun a => resp) ∘ k resp) s
101-
-- exact s
102-
)
103-
-- fun st => Prog.scp ⟨s, fun p => ProgN.varS (k p st)⟩)
95+
apply ProgN.scp op'
96+
intro resp
97+
specialize k resp s
98+
apply Prog.bindN' k
99+
intro scoped_prog
100+
specialize scoped_prog s
101+
exact ProgN.varS scoped_prog)
104102
p
105103

104+
def run' (p : Prog (Reader S :: effs) α) (s : S) : Prog effs α :=
105+
Prog.mapU ULift.down (runL p s)
106+
106107
def run
107108
(s : S)
108-
(p : Prog (Reader S :: effs) (ULift α)) :
109-
Prog effs (ULift α) :=
109+
(p : Prog (Reader S :: effs) α) :
110+
Prog effs α :=
110111
run' p s
111112

112113
end Reader
113114

114115
section Examples
115116

116-
-- open Reader
117+
open Reader
117118

118-
-- def tick {effs} [Reader Nat ∈ effs] : Prog effs Nat := do
119-
-- ask
119+
def tick {effs} [Reader Nat ∈ effs] : Prog effs Nat := do
120+
ask
120121

121-
-- def prog : Prog [Reader Nat] (List Nat) := do
122-
-- let l1 ← ask
123-
-- let l2 ← localR (fun x => x + 1) ask
124-
-- let l3 ← ask
125-
-- pure [l1, l2, l3]
122+
def prog : Prog [Reader Nat] (List Nat) := do
123+
let l1 ← ask
124+
-- let l2 ← localR (fun x => x + 1) ask
125+
let l3 ← ask
126+
pure [l1, l3]
126127

127-
-- #guard Prog.run (Reader.run 0 prog) = [0,1,1]
128+
#guard Prog.run (Reader.run 0 prog) = [0, 0]
128129

129130
-- #guard Prog.run (Reader.run 0 (do ask)) = 0
130131

131-
132-
133-
-- end Examples
132+
end Examples

0 commit comments

Comments
 (0)