首页 文章

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

提问于
浏览
3

给定以下类型定义:

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 回答

  • 0

    如果你使用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

    如何将您的数据类型设置为:

    type 'a range = Full | Range of ('a * 'a * ('a -> string));;
    
  • 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

相关问题