blob: 07a8e8a3788cc23c8517a38ace9be3b313e85f5e [file] [edit]
--
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