Вы правы: OCaml отбрасывает типы во время выполнения и, следовательно, никакой способ отличить ваши 10 на самом деле не является целым или десятым конструктором вариантов. Имена конструкторов также недоступны, поэтому невозможно распечатать данные.
Более того, полиморфизм OCaml является параметрическим. Вы не можете определить функции, которые работают по-разному в зависимости от типов.
Одним частичным решением этой проблемы является использование CamlP4 для автоматической генерации функций принтера для типов данных. Но, тем не менее, у вас не может быть «полигамного» отпечатка, который работает на все. Вы должны комбинировать принтеры вручную, например print_list (print_option print_int).
Я расширил OCaml, чтобы иметь такой полиморфный отпечаток (и другие приятные вещи) много лет назад. Это называется GCaml. Но не поддерживается долго.
Mli файлы не связаны с этим. Они предназначены для написания сигнатур модулей, для сокрытия реализаций для более простых интерфейсов для пользователей модулей.