After this commit, we have to use an explicit `discard` in code such as ``` def g (x : Nat) : IO Nat := ... def f (x : Nat) : IO Unit := do discard <| g x -- type error without the `discard` IO.println x ``` Motivation: prevent users from making mistakes such as ``` def f (xs : Array Nat) : IO Unit := do xs.set! 0 1 IO.println xs ``` when they meant to write ``` def f (xs : Array Nat) : IO Unit := do let xs := xs.set! 0 1 IO.println xs ```
23 lines
475 B
Text
23 lines
475 B
Text
def f (x : Nat) : IO Unit := do
|
|
x -- Error
|
|
IO.println x
|
|
|
|
def f' (x : Nat) : IO Unit := do
|
|
discard x
|
|
IO.println x
|
|
|
|
def g (xs : Array Nat) : IO Unit := do
|
|
xs.set! 0 1 -- Error
|
|
IO.println xs
|
|
|
|
def g' (xs : Array Nat) : IO Unit := do
|
|
discard <| xs.set! 0 1 -- Error
|
|
IO.println xs
|
|
|
|
def h (xs : Array Nat) : IO Unit := do
|
|
pure (xs.set! 0 1) -- Error
|
|
IO.println xs
|
|
|
|
def h' (xs : Array Nat) : IO Unit := do
|
|
discard <| pure (xs.set! 0 1) -- Error
|
|
IO.println xs
|