我搜索了一下,发现有几个人在问这个问题,但我找不到明确的答案。如何在sml中打印非字符串?
例如,如果我有一个ADT的实例,即由datatype
声明的类型,并且我想打印该值以进行调试。我是否负责编写一个函数,将这样的对象转换为字符串,然后打印该字符串?或者有没有我应该使用的打印机库?或者是否有某种printObject或toString函数?
另外,如何打印其他非字符串对象,如true
和false
看起来sml知道如何打印这样的对象,因为当我在emacs中使用C-l编译文件时,我看到如下输出,表明sml确实知道如何打印值。
[opening /Users/jimka/Repos/mciml/ex1.1.sml]
type key = string
datatype tree = LEAF | TREE of tree * string * tree
val empty = LEAF : tree
val insert = fn : key * tree -> tree
val member = fn : key * tree -> bool
val t1 = TREE (LEAF,"a",LEAF) : tree
val t2 = TREE (LEAF,"a",TREE (LEAF,"c",LEAF)) : tree
val t3 = TREE (LEAF,"a",TREE (TREE (LEAF,"b",LEAF),"c",LEAF)) : tree
val it = true : bool
val it = () : unit
发布于 2021-01-01 05:22:49
如何在sml中打印非字符串?
据我所知,这是不可能的(以可移植的方式)。根据您正在使用的实现,它可能会公开一个执行此操作的函数。
另外,如何打印其他非字符串对象,如true
和false
?
?
许多具有相应基本库结构的类型(例如,int
和Int
)都有一个toString
函数,因此您可以通过print (Bool.toString b)
和与int
的Int.toString
相似的方式打印布尔型b
。
一些特定于实现的想法:
对于PolyML,您可以使用函数PolyML.print
打印任意类型的值(尽管您可能需要显式地进行类型注释;参数的类型不应该有任何类型变量)。
对于SML/NJ,您可以尝试看看这里讨论的方法https://sourceforge.net/p/smlnj/mailman/message/21897190/,尽管这似乎比它的价值更麻烦。
对于MLton,我不知道有什么像多态函数这样的东西,但他们有几个关于实现printf或类似函数的指南。
看起来莫斯科ML支持函数Meta.printVal
,但仅在交互会话中支持。我不确定SML#对这类事情有什么支持。
我是否负责编写一个函数,将这样的对象转换为字符串,然后打印该字符串?
一般来说,是的。
看起来sml知道如何打印这些对象。
这取决于您的SML实现,因为REPL可以访问比程序正常情况下更多的信息。例如,SML/NJ之所以能够做到这一点,是因为REPL可以访问在其他地方不可用的类型信息(有关来源,请参阅链接的邮递员线程中的John Reppy语句)。
您可能还会发现MLton的TypeIndexedValues示例页面对这类事情很有帮助,尽管我自己并没有仔细检查它的质量。
https://stackoverflow.com/questions/65518938
复制相似问题