-- def f1 (x : Nat) : IO Nat := do y := 1 -- error 'y' cannot be reassigned def f2 (xs : List (Nat × Nat)) : List (Nat × Nat) := Id.run <| do for (x, y) in xs do (y, x) := (x, y) -- error 'y' (and 'x') cannot be reassigned def f3 (xs : List (Nat × Nat)) : List (Nat × Nat) := Id.run <| do for p in xs do p := (p.2, p.1) -- works. `forInMap` requires a variable inductive Vector' (α : Type) : Nat → Type | nil : Vector' α 0 | cons : α → {n : Nat} → Vector' α n → Vector' α (n+1) def f4 (b : Bool) (n : Nat) (v : Vector' Nat n) : Vector' Nat (n+1) := Id.run <| do let mut v := v if b then v := Vector'.cons 1 v Vector'.cons 1 v def f5 (y : Nat) (xs : List Nat) : List Bool := Id.run <| do let mut y := y for x in xs do y := true -- invalid reassigned def f6 (xs : List Nat) : IO (List Nat) := do for x in xs do -- type error IO.println x def f7 (xs : List Nat) : IO Unit := do unless xs.isEmpty do break -- error must be inside 'for' def f8 (xs : List Nat) : IO Unit := do unless xs.isEmpty do continue -- error must be inside 'for' def f9 (xs : List Nat) : IO Unit := do return xs -- error, must be last element in the sequence return xs def f10 (x : Nat) : IO Unit := do IO.println x #print f10 -- we do not generate an unnecessary bind def f11 (x : Nat) : IO Unit := do if x > 0 then IO.println "x is not zero" IO.mkRef true -- error here as expected def f12 (x : Nat) : IO Unit := do let mut x := x if x > 0 then pure true else x := x + 1 IO.println "hello" -- error here the other branch returns `Bool` IO.println x def f13 (xs : List Nat) : IO Bool := do if xs == [] then return true else return false IO.println "hello" -- error unreachable def f14 (x : Nat) : IO Nat := do let y ← if x == 0 then return 100 else return 200 IO.println ("y: " ++ toString y) -- error unreachable return 0