У меня есть тип диапазона, определенный как:
type 'a range = Full | Range of ('a * 'a)
Однако я хотел бы ограничить 'a целым числом, с плавающей запятой или символом, без других допустимых типов для' 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, но мне интересно, есть ли другой способ?