gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:17:17 24 4
gpt4 key购买 nike

我有一个返回 (char * int) list list 的函数,如 [[(#"D", 3)], [(#"F", 7)]] ,现在我想知道是否可以将其转换为字符串,以便我可以使用 I/O 并将其读入另一个文件?

最佳答案

首先,我假设您的意思是像 [[(#"D", 3)], [(#"F", 7)]] 这样的值。 (注意额外的括号)因为 SML 需要围绕元组构造的括号。 OCaml 使用稍微不同的语法,并且只允许使用逗号,例如 a, b , 构造元组。我提到这一点是因为下面的内容完全特定于标准 ML,并且不适用于 OCaml,因为我相信在 OCaml 中你最好的选择是一种完全不同的方法,我不太了解(宏,即 ocamlp4/5)。所以我认为这只是一个错字,并且您对标准 ML 感兴趣。

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

可以想象,这很快就会变得乏味。我花了一点时间研究这些选项(对于这个和其他样板函数,如 compare : 't * 't -> order ),并且在论文“工作 ML'er 的泛型”( http://dl.acm.org/citation.cfm?id=1292547 )中概述了一种非常有趣的技术,但它很漂亮高级,我实际上永远无法编译代码(也就是说这篇论文非常有趣) 该论文中描述的完整泛型库位于 MLton lib repo (https://github.com/MLton/mltonlib/tree/master/com/ssh/generic/unstable) 中。也许你会有更好的运气?

恕我直言,这是一种重量稍轻但功能较弱但更易于理解的方法。在阅读了那篇论文并努力让它发挥作用后,我写了这篇文章。这个想法是为 toString 编写构建 block 。函数(在这种情况下称为 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

我喜欢这一点的是,组合函数读起来就像翻过来的类型。这是一种相当优雅的风格,我不能把它归功于我从上面链接的泛型论文中得到的。
Show 的其余代码(和一个相关的模块 Eq 用于相等比较)在这里: https://github.com/spacemanaki/lib.sml

关于type-conversion - 将数据类型转换为字符串 (SML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22150715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com