2017-05-08 49 views
3

据我所知,因为OCaml中的设计和基本理念,有可以使用的,例如,打印出的任意数据结构,诸如,例如不通用的打印功能,这一个使用内置漂亮的打印机进行调试?

[([2; 1; 0], 1.); ([2; 1], 0.471206873564138595); ([2; 0], 0.467882609464025379)] 

用于调试目的。一个可以处理每个数据结构的函数在OCaml中没有输入类型,这没有任何意义。

我可以写一个小函数来打印任何数据结构我可以从标准的数据结构作出 - 列表,元组,数字等(如图所示herehere),然后我必须写一个另一个小函数不同的数据结构等等。如果你只是想获得一些调试输出,那么这是很多工作。

然而,UTOP和OCaml的使用漂亮打印程序的内置,以显示任何类型评价结果,并显示列表,元组等的内容是否有一种方式来获得访问该功能--ie要访问REPL的一部分,请访问P。实际上,我从utop的终端输出做了一个鼠标副本来构造我用来显示上面列表的字符串。我不能从我的代码那么做吗?

我接受,如果可以做到这一点,那实际上是一件坏事,一般来说它只应用于调试和其他简单的目的。为了广泛使用通用打印功能,首先要阻止类型系统是使用OCaml的原因之一。

(我敢肯定的答案是“不,你不能这样做”,或者我会遇到一个办法做到这一点。为什么,虽然?似乎很简单。)

回答

2

打印顶层和顶层的功能可以访问类型信息。一个普通的OCaml可执行文件(字节码或本地)没有类型信息(可以说)。所以你不能从顶层或者顶层插入打印功能。

这是一个相当常见的问题(因为调试确实很方便)。在此之前的答案中有更多信息:How can OCaml values be printed outside the toplevel?

+0

谢谢。这是有道理的。我在SO寻找类似的问题,但没有找到它,虽然我知道其他人也想知道同样的事情。好像我的问题应该被标记为您链接问题的重复,所以我已经投票结束了我自己的问题。我不知道这是否合理。 – Mars