在SML中执行命令后,将返回“it”,其中包含从命令返回的数据和类型。例如:
false;
val it = false : bool
假设我在这样的程序中有绑定:
val argsToOutput = (map (fn (Absyn.var_exp(n)) =>
(lookupReference env n)) exps)
有没有办法打印“argsToOutput”的值和数据类型(在程序中间),打印方式与打印出来的方式类似?
答案 0 :(得分:2)
你可以这样做:
val argsToOutput = (map (fn (Absyn.var_exp(n)) =>
(lookupReference env n)) exps)
...
in
(print (argsToOutput); 2 )
end
而不是2,你拥有你的身体的价值。赔率是打印将在argsToOutput上barf,但它会给你找到预期类型为字符串的类型。
当我不得不打印出数据类型的值时,我创建了一个采用数据类型的tostring()函数,并将其转换为字符串。它需要一些工作,因为它有一些嵌套的数据类型,但之后非常有价值,因为它适用于所有类型的变量。
答案 1 :(得分:1)
SML是静态类型的,因此程序中任何值的类型在编译时都是静态已知的。当你想“打印出来”时,我不确定你想要什么。
也许你不能通过自己查看代码来弄清楚某些东西的类型。当您在顶层将一个值定义到解释器中时,无论是直接还是使用use "whatever.sml";
加载文件,解释器都会告诉您为该值推断的类型。
或者,如果您有一段代码,您可以在此处发布它(以及它所依赖的任何代码),我们可以帮助您确定其中特定值的类型。
如果您想确保特定值是某种类型,您可以使用类型保护:(expression : type)
与expression
相同,只是在类型检查期间它将确保表达式就是那种类型。
如果你想以某种方式在运行时获取类型信息,我认为你不能,而且你不应该这样做,因为它在编译时已经知道了。
答案 2 :(得分:1)
有没有办法打印“argsToOutput”的值和数据类型(在程序中间)
没有。它工作在顶层,因为编译器保留编译阶段的类型。它不适用于从函数体中拉出的任意表达式。但如果你有幸拥有一个表达式,其值与函数无关,你可以将它拉出来并在顶层写一个val
绑定并获得你想要的结果:
- val thing = hd [1, 2, 3];
val thing = 1 : int
这是一种糟糕的安慰,因为它几乎没有感兴趣的案例。
我想您可能想要搜索其他常见问题解答的答案:
(答案很难看。)