将多态类型转换为字符串('a - > string)

ane*_*eal 3 ocaml

给定以下类型定义:

type 'a range = Full | Range of ('a * 'a);;
Run Code Online (Sandbox Code Playgroud)

如何将此类型的值转换为字符串?

我目前有:

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

但是,当然,这表示a和b的类型为int.它们也可以是浮点数或字符(请参阅我之前关于约束类型的问题)

Jef*_*ado 8

更改您的函数以接受字符串转换器并在您的实现中使用它.然后当你调用它时,传入适当的转换器和范围.就像是:

let string_of_range str_conv = function
  | Full -> "Full"
  | Range(a, b) -> "Range (" ^ (str_conv a) ^ ", " ^ (str_conv b) ^ ")"
Run Code Online (Sandbox Code Playgroud)

它将具有以下类型: string_of_range : ('a -> string) -> 'a range -> string

示例电话:

string_of_range string_of_int (Range (1, 2))
Run Code Online (Sandbox Code Playgroud)

通过这种方式订购,您可以轻松制作更专业的转换器.

let string_of_int_range = string_of_range string_of_int
Run Code Online (Sandbox Code Playgroud)

它将具有以下类型: string_of_int_range : int range -> string