def f : IO Nat := do
  IO.println "hello"
  IO.getStdin
  return 10

def f1 : ExceptT String (StateT Nat Id) Nat := do
  modify (· + 1)
  get

def f2 (x : Nat) : ExceptT String (StateT Nat Id) Nat := do
  modify (· + x)
  get

def g1 : ExceptT String (StateT Nat Id) Unit := do
  let x : String ← f1
  return ()

def g2 : ExceptT String (StateT Nat Id) Unit := do
  let x : String ← f2 10
  return ()

def g3 : ExceptT String (StateT Nat Id) String := do
  let x ← f2
  f1

example : Nat := Id.run do
  let mut n : Nat := 0
  (n, _) := (false, false)
  n
