Мне интересно, можно ли построить нечто похожее на множественную отправку в 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 это есть. Разве могут открывать типы или объекты? Я не ищу самую общую функцию между типами, это достаточно, если я могу явно указать несколько комбинаций типов ввода и соответствующий тип вывода.