lean4-htt/tests/lean/or_shortcircuit.lean
Leonardo de Moura 483f32edd8 feat: in pure code, do use assume Id monad at do notation
This feature produced counterintuitive behavior and confused users.
See discussion at #770.

As pointed out by @tydeu, it is not too much work to write `Id.run <|`
before the `do` when we want to use the `do` notation in pure code.

closes #770
2021-12-10 12:55:14 -08:00

21 lines
430 B
Text

@[noinline] def c1 (x : Nat) : Bool :=
dbg_trace "executed c1"
x == 0
@[noinline] def c2 (x : Nat) : Bool :=
dbg_trace "executed c2"
x == 0
@[noinline] def c3 (x : Nat) : Bool :=
dbg_trace "executed c3"
x > 0
@[noinline] def f (x : Nat) := x + 1
def tst (x : Nat) : Nat := Id.run <| do
let x := if !c1 x || (!c2 x && c3 x) then f x else f (x+2)
match x with
| 0 => f (x+1)
| y+1 => f (y+3)
#eval tst 10