Ограничение полиморфного типа

У меня есть тип диапазона, определенный как:

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, но мне интересно, есть ли другой способ?

12
задан cago 26 February 2012 в 23:00
поделиться