Мне интересно, можно ли построить нечто похожее на множественную отправку в OCaml. Для этого я попытался сделать явный тип входной сигнатуры мультиметода. В качестве примера я определяю тип числа
type _ num =
| I : int -> int num
| F : float -> float num
Теперь я хотел бы, чтобы функция add суммировала 'a num и a 'b num и возвращала int num, если оба 'a и 'b являются int, а float num, если at по крайней мере, один из них является float. Кроме того, система типов должна знать, какой конструктор будет использовать выход. То есть он должен быть статически известен при вызове функции, что выход имеет тип int num, например.
Это возможно? Пока я могу управлять функцией сигнатуры type a b. a num * b num -> a num, например, чтобы в качестве первого аргумента всегда должен был поставляться (более общий) float. Случай int num * float num должен быть запрещен, что приведет к не исчерпывающим сопоставлениям шаблонов и исключениям времени выполнения.
Кажется, что нужна подпись, например type a b. a num * b num -> c(a,b) num, где c - это функция типа, содержащая правила продвижения типа. Я не думаю, что у OCaml это есть. Разве могут открывать типы или объекты? Я не ищу самую общую функцию между типами, это достаточно, если я могу явно указать несколько комбинаций типов ввода и соответствующий тип вывода.