首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ML中打印

如何在ML中打印
EN

Stack Overflow用户
提问于 2020-12-31 17:21:53
回答 1查看 96关注 0票数 0

我搜索了一下,发现有几个人在问这个问题,但我找不到明确的答案。如何在sml中打印非字符串?

例如,如果我有一个ADT的实例,即由datatype声明的类型,并且我想打印该值以进行调试。我是否负责编写一个函数,将这样的对象转换为字符串,然后打印该字符串?或者有没有我应该使用的打印机库?或者是否有某种printObject或toString函数?

另外,如何打印其他非字符串对象,如truefalse

看起来sml知道如何打印这样的对象,因为当我在emacs中使用C-l编译文件时,我看到如下输出,表明sml确实知道如何打印值。

代码语言:javascript
运行
复制
[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
EN

回答 1

Stack Overflow用户

发布于 2021-01-01 05:22:49

如何在sml中打印非字符串?

据我所知,这是不可能的(以可移植的方式)。根据您正在使用的实现,它可能会公开一个执行此操作的函数。

另外,如何打印其他非字符串对象,如truefalse

许多具有相应基本库结构的类型(例如,intInt)都有一个toString函数,因此您可以通过print (Bool.toString b)和与intInt.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示例页面对这类事情很有帮助,尽管我自己并没有仔细检查它的质量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65518938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档