Преобразование полиморфного типа в строку ('a -> string) - PullRequest
3 голосов
/ 03 июня 2011

Учитывая следующее определение типа:

type 'a range = Full | Range of ('a * 'a);;

Как преобразовать значения этого типа в строки?

В настоящее время у меня есть:

let string_of_range r = match r with
  | Full -> "Full"
  | Range(a,b) -> "Range("^(string_of_int a)^","^(string_of_int b)^")";; 

Но, конечно, это говорит о том, что a и b имеют тип int. Это также могут быть числа с плавающей точкой или символы (см. Мой предыдущий вопрос об ограничении типа)

Ответы [ 3 ]

8 голосов
/ 03 июня 2011

Измените вашу функцию, чтобы она принимала строковый преобразователь и использовала его в вашей реализации.Затем, когда вы звоните, передайте соответствующий конвертер и диапазон.Что-то вроде:

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

2 голосов
/ 05 июня 2011

Этот конвертер можно получить бесплатно, если вы используете sexplib .Как только вы включите расширение синтаксиса, то написав это:

type 'a range = Full | Range of ('a * 'a) with sexp

автоматически сгенерирует функцию с этой подписью

val sexp_of_range : ('a -> Sexp.t) -> 'a range -> Sexp.t

И если вы объявите:

type int_range = int range with sexp

вы получите

val sexp_of_int_range : int range -> Sexp.t

И вы можете даже создать в потоке соответствующий конвертер:

let to_string range = Sexp.to_string (<:sexp_of<int range>> range)
0 голосов
/ 03 июня 2011

Как насчет того, чтобы сделать ваш тип данных как:

type 'a range = Full | Range of ('a * 'a * ('a -> string));;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...