给出以下类型定义:
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。它们也可以是浮点数或字符(请参阅我之前关于约束类型的问题)
答案 0 :(得分:8)
更改您的函数以接受字符串转换器并在您的实现中使用它。然后当你调用它时,传入适当的转换器和范围。类似的东西:
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
答案 1 :(得分:2)
如果您使用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)
答案 2 :(得分:0)
如何将数据类型设置为:
type 'a range = Full | Range of ('a * 'a * ('a -> string));;