查看SML完整列表

3

有没有办法使用SML打印完整的列表?

通常情况下,在SML中,当我有太多元素时,它会打印前几个元素,用“,”分隔,然后用...省略列表的其余部分,但我想看到完整的列表。有没有办法这样做?

val a =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18,19,20]

如果我在REPL上写a,它会返回类似以下内容:
a=[1,2,3,4,5,...]
3个回答

6
假设您正在使用SML/NJ。
您想要自定义的是Control.Print中的参考值。在这种情况下,您想要将printLength的值更改为较大的值,例如。
Control.Print.printLength := 100;

一般来说,你需要改变的是print*引用。然而对于字符串,由于某种原因,他们选择将其称为stringDepth
假设您正在使用MosML。
莫斯科ML语言概述中可以看到,Meta单元公开了这两个函数(用于"控制交互式系统")。
val printDepth : int ref  (* limit printed data depth *)
val printLength : int ref (* limit printed list and vector length *)

4

我假设您正在使用Poly/ML。函数PolyML.print_depth指定在任何结构(包括列表)中打印应该有多深。将其更改为较大值:

PolyML.print_depth 500

太好了,非常感谢。您知道在哪里可以找到PolyML签名的完整文档吗?我已经谷歌了很多次,但甚至在PolyML网站上也找不到任何东西! - csey
很遗憾,我没有使用PolyML自从我写下这个答案,所以你最好去谷歌搜索。我至少找到了这两个看起来很有希望的链接:http://www.lfcs.inf.ed.ac.uk/software/polyml/docs/Intro1.html和http://polyml.org/docs/PrettyPrint.html - Emil Vikström
唉,很多都已经过时了。不管怎样,还是谢谢你的尝试! - csey
当我们使用SML/NJ时,我们经常会在代码中探索。毕竟它是开源的。很多文档中的歧义都可以通过这种方式得到解答。 - Emil Vikström

0

这个输出仅用于调试,虽然很方便,但并不是一个正确的方法(如果您生成可执行文件,则不会得到此输出)。要打印出所有元素而不受所选 ML 提示中设置的打印限制的影响,可以执行以下操作:

fun listToString [] = "[]\n"
|   listToString (c::l) =
        "[" ^ (Int.toString c)
        ^ foldl (fn (s1, s2) => s2 ^ ", " ^ s1) "" (map (Int.toString) l)
        ^ "]\n"
val _  = print (listToString a)

一个更简单的实现利用标准库将是 fun listToString l = "[" ^ String.concatWith ", " (List.map Int.toString l) ^ "]" - Andreas Rossberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接