У меня есть диапазон, определенный как:
type 'a range = Full | Range of ('a * 'a)
Однако я хотел бы ограничить 'a целым числом или float или char, без каких-либо других допустимых типов для' a.
Range(0,10) (* valid *)
Range(0.0, 10.0) (* valid *)
Range('a', 'z') (* valid *)
Range("string1", "string2") (* other types like this shouldn't type check *)
Я решил, что могу изменить свои определения типов:
type sequential = S_int of int | S_float of float | S_char of char ;;
type range = Full | Range of (sequential * sequential);;
Тем не менее, это позволит сделать что-то вроде:
Range(S_int(0), S_float(10.0));; (* problem: mixes int and float *)
... но я хочу, чтобы оба компонента Range были одного и того же типа.
Я предполагаю, что другой подход заключался бы в создании типа int_range, типа float_range и типа char_range, но мне интересно, есть ли другой способ?