1

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

false;  
val it = false : bool

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

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

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

4

3 回答 3

2

你可以这样做:

 val argsToOutput = (map (fn (Absyn.var_exp(n)) => 
                               (lookupReference env n)) exps)
 ...
 in
   (print (argsToOutput); 2 )
 end

而不是 2 你有你的让身体的价值。奇怪的是打印会在 argsToOutput 上出错,但它会给你在预期类型是字符串的地方找到的类型。

当我不得不打印出数据类型的值时,我创建了一个 tostring() 函数来获取数据类型,并将其转换为字符串。它需要一些工作,因为它有一些嵌套的数据类型,但之后非常有价值,因为它适用于该类型的所有 var。

于 2009-05-01T02:14:54.093 回答
1

有没有办法打印“argsToOutput”的值和数据类型(在程序中间)

不。它在顶层工作,因为编译器保留了编译阶段的类型。它不适用于从函数体中提取的任意表达式。但是,如果您有幸拥有一个其值与函数无关的表达式,您可以将其拉出并val在顶层编写一个绑定并得到您想要的:

- val thing = hd [1, 2, 3];
val thing = 1 : int

这是一个很差的安慰,因为它涵盖了一些感兴趣的案例。

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

  1. 如何让我的 ML 程序进行类型检查?
  2. 如何确定类型良好的 ML 程序中子表达式的类型?
  3. 在 ML 程序中,如何打印值以进行调试?

(答案很丑。)

于 2009-05-02T17:05:37.580 回答
1

SML 是静态类型的,因此程序中任何值的类型在编译时都是静态已知的。当你想“打印出来”时,我不确定你想要什么。

也许你无法通过自己查看代码来弄清楚某物的类型是什么。当您在解释器的顶层定义一个值时,无论是直接还是使用加载文件use "whatever.sml";,解释器都会告诉您为该值推断的类型。

或者,如果您有一段代码,您可以在此处发布它(以及它所依赖的任何代码),我们可以帮助您确定其中的特定值具有什么类型。

如果你想确保一个特定的值是某种类型,你可以使用类型保护:(expression : type)是一样的东西expression,除了在类型检查期间它会确保那个表达式是那个类型。

如果你想在运行时以某种方式获取类型信息,我认为你不能,而且你不应该这样做,因为它在编译时就已经知道了。

于 2009-04-27T08:36:01.107 回答