Измените вашу функцию, чтобы она принимала строковый преобразователь и использовала его в вашей реализации.Затем, когда вы звоните, передайте соответствующий конвертер и диапазон.Что-то вроде:
let string_of_range str_conv = function
| Full -> "Full"
| Range(a, b) -> "Range (" ^ (str_conv a) ^ ", " ^ (str_conv b) ^ ")"
Он будет иметь тип: string_of_range : ('a -> string) -> 'a range -> string
Пример вызова:
string_of_range string_of_int (Range (1, 2))
Заказав таким образом, вы можете легко сделать более специализированные преобразователи.
let string_of_int_range = string_of_range string_of_int
Будет иметь тип: string_of_int_range : int range -> string