Ocaml 将多态类型转换为字符串(&x27;a->;字符串)

Ocaml 将多态类型转换为字符串(&x27;a->;字符串),ocaml,Ocaml,给定以下类型定义: 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类型。它们也可以是float或char(请参阅我

给定以下类型定义:

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类型。它们也可以是float或char(请参阅我前面关于约束类型的问题)

将数据类型设置为:

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

更改函数以接受字符串转换器,并在实现中使用它。然后,当您调用它时,传入一个适当的转换器和范围。比如:

let string_of_range str_conv = function
  | Full -> "Full"
  | Range(a, b) -> "Range (" ^ (str_conv a) ^ ", " ^ (str_conv b) ^ ")"
它将具有以下类型:
string\u 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\u of_int\u range:int range->string

如果您使用,您可以免费获得这种转换器。打开语法扩展后,编写以下内容:

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)
let to_string range=Sexp.to_string(range)

我认为嵌入转换器虽然可以工作,但对于这种简单的代数类型来说并不是一种特别实用的方法。