ahh… finally got it… nothing.mli says
val unreachable_code : t -> _
while nothing.ml says
let unreachable_code = function
| (_ : t) -> .
;;
and the resulting type of unreachable_code according to utop is
Core.Nothing.t -> 'a
So that _ in .mli seems to indicate that it can be any type… There probably is a clever name for such use of _ and one day I’ll find it 