I don’t think my first example is an error; I wrote it that way deliberately to make the typechecker infer the type of x in f to be ref<[> #b]>, and the type of x in g be [> #a]. That way, f can accept something more than #b, while inside g, the switch expression is still exhaustive. I believe this is because the type checker unifies the types with the most general types.
That is why I am puzzled with the second example, as I wrote it (almost) the same way as I have done with the first example—so I think the second example is misleading for me. What’s more puzzling is that the following type checks:
let f = v => {
let (_x, setX) = React.useState(() => #b)
setX(_ => v)
}
let g = () => {
let (x, _setX) = React.useState(() => #a)
f(x)
/* switch x {
| #a => f(x)
} */
}
and this too:
let f = v => {
let (_x, setX) = React.useState(() => #b)
setX(_ => v)
}
let g = () => {
let x = #a
switch x {
| #a => f(x)
}
}