如何在SML中打印类型信息?

时间:2009-04-27 03:58:03

标签: sml smlnj

在SML中执行命令后,将返回“it”,其中包含从命令返回的数据和类型。例如:

false;  
val it = false : bool

假设我在这样的程序中有绑定:

 val argsToOutput = (map (fn (Absyn.var_exp(n)) => 
                               (lookupReference env n)) exps)

有没有办法打印“argsToOutput”的值和数据类型(在程序中间),打印方式与打印出来的方式类似?

3 个答案:

答案 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

这是一种糟糕的安慰,因为它几乎没有感兴趣的案例。

我想您可能想要搜索其他常见问题解答的答案:

  1. 如何让ML程序进行打字检查?
  2. 如何确定良好类型的ML程序中子表达式的类型?
  3. 在ML程序中,如何打印调试值?
  4. (答案很难看。)