Полиморфная функция compare
может использоваться для создания экземпляров предопределенных функторов OCaml (Map.Make
, Set.Make
, ...).В этом случае нам нужно только знать, что он ведет себя как порядок, но было бы полезно понять, как он на самом деле определен.Например, как убедиться, что следующая функция правильно вычисляет максимум списка:
let rec max_list = function
| [] -> None
| h::t -> max (Some h) (max_list t)
Сначала я подумал, что конструкторы, определенные ранее, меньше, чем конструкторы, определенные позже.Однако, похоже, это не так, поскольку max Non (Som 2)
имеет значение Som 2 : opt
, определено ли opt
как type 'a opt = Non | Some of 'a
или как type 'a opt = Some of 'a | Non
.
Чтобы сравнить значения алгебраического типа данных, яожидать, что он сравнивает конструкторы, а затем, если они совпадают, сравнивает их аргументы.Почему это не так, и как определяется сравнение?