Type conversion 将数据类型转换为字符串(SML)

Type conversion 将数据类型转换为字符串(SML),type-conversion,sml,Type Conversion,Sml,我有一个返回(char*int)列表的函数,比如[(#“D”,3)],[(#“F”,7)],现在我想知道是否可以将其转换为字符串,这样我就可以使用I/O并将其读取到另一个文件中?首先,我假设你指的是[(#“D”,3)],[(#“F”,7)](注意额外的参数)因为SML需要在元组构造周围使用括号。OCaml使用稍微不同的语法,只允许逗号,如a,b,来构造元组。我之所以提到这一点,是因为下面的内容完全特定于标准ML,而不适用于OCaml,因为我相信在OCaml中,您的最佳选择是一种完全不同的方法,我

我有一个返回
(char*int)列表的函数,比如
[(#“D”,3)],[(#“F”,7)]
,现在我想知道是否可以将其转换为字符串,这样我就可以使用I/O并将其读取到另一个文件中?

首先,我假设你指的是
[(#“D”,3)],[(#“F”,7)]
(注意额外的参数)因为SML需要在元组构造周围使用括号。OCaml使用稍微不同的语法,只允许逗号,如
a,b
,来构造元组。我之所以提到这一点,是因为下面的内容完全特定于标准ML,而不适用于OCaml,因为我相信在OCaml中,您的最佳选择是一种完全不同的方法,我对它了解不多(宏,即ocamlp4/5),所以我假设这只是一个输入错误,您对标准ML感兴趣

现在,不幸的是,标准ML中没有通用的
toString
函数。类似的东西必须在语言和实现中有某种特殊的支持,因为不可能用
'a->string
类型编写函数。您基本上必须编写自己的
toString:t->string
f或每种类型
t

正如你所能想象的,这很快就会变得单调乏味。我花了一点时间研究了选项(对于这个和其他样板函数,如
compare:'t*'t->order
),还有一个非常有趣的技术,在《用于工作的ML'er的泛型》(Generics for the working ML'er)一文中概述但是它非常高级,而且我从来没有真正编译过代码(也就是说这篇文章非常有趣)。那篇文章中描述的完整泛型库在MLton lib repo()中。也许你会有更好的运气

IMHO,这里有一个稍微轻一点的方法,虽然功能不太强大,但更容易理解。我是在阅读了那篇文章并努力让它发挥作用后写的。这个想法是为
toString
函数(在本例中称为
show
)编写构建块,并将它们与您自己类型的其他函数组合在一起

structure Show =
   struct
      (* Show.t is the type of toString functions *)
      type 'a t = 'a -> string

      val int: int t = Int.toString

      val char: char t = Char.toString

      val list: 'a t -> 'a list t =
       fn show => fn xs => "[" ^ concat (ExtList.interleave (map show xs) ",") ^ "]"

      val pair: 'a t * 'b t -> ('a * 'b) t =
       fn (showa,showb) => fn (a,b) => "(" ^ showa a ^ "," ^ showb b ^ ")"

      (* ... *)
   end
由于您的类型实际上没有任何用户定义的数据类型,因此使用以下结构编写
toString
函数非常容易:

local
   open Show
in
   val show : (char * int) list list -> string = list (list (pair (char, int)))
end

- show [[(#"D", 3)], [(#"F", 7)]] ;
val it = "[[(D,3)],[(F,7)]]" : string
我喜欢的是,组合函数读起来像是翻过来的类型。这是一种相当优雅的风格,我不能把它归功于上面链接的泛型论文


的其余代码显示
(以及用于相等比较的相关模块
Eq
)这里是:

太好了!谢谢!只有一个问题:
ExtList
结构到底是做什么的,为什么在
show
结构中需要它?
ExtList
只是一些用于操作列表的实用函数:
show
模块在
show.list
中使用了
interleave
。非常聪明的设计。它是遗憾的是,与动态类型语言(如Python的
\uuu str\uuu
\uu repr\uu
机制)中的等价语言相比,它仍然需要做大量的工作。