Мне нравится ответ @ gasches.
В качестве краткого дополнения: модуль Set в OCaml предназначен для создания экземпляра модулем OrderedType, что означает, что вы не можете напрямую использовать нативные int
s OCaml напрямую.
Таким образом, необходимо использовать модуль, который соответствует запрошенной подписи. Определение подписью RestrictedOrderedType, выполненное gasche, делает это и элегантно включает в себя нижнюю и верхнюю граничные поля. Более грубым подходом было бы использование модулей Int32 или Int64 OCaml, которые соответствуют запрошенной сигнатуре OrderedType, и жесткое кодирование границ в модуле MySet
.
Ниже приведена небольшая переформулировка примера Гаше, чтобы проиллюстрировать этот момент.
module MySet = struct
include Set.Make(Int32)
exception Not_in_range of Int32.t
let lower_bound = Int32.of_int 5
let upper_bound = Int32.of_int 10
let add elt set =
if (elt < lower_bound)||(elt > upper_bound)
then raise (Not_in_range elt)
else add elt set
end;;