【问题标题】:How do I print type information in SML?如何在 SML 中打印类型信息?
【发布时间】:2010-10-21 23:44:03
【问题描述】:

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

false;  
val it = false : bool

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

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

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

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    你可以这样做:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 问题是我不知道类型是什么。我正在编写一个类的代码,我们使用 CM.make 来“编译”一组 6 个文件。我正在努力找出实际上绑定到某个绑定的数据类型(和值)。在这种情况下发布所有代码是不切实际的。还有其他想法吗?
      • 我不知道。有没有办法将文件加载到解释器中?或者,您可以进入并在所有函数参数和返回类型和变量上放置类型注释。我知道 ML 中类型推断的一部分是你不需要为你的变量声明类型,但有时它很适合调试。另外,也许您可​​以尝试为您的值添加类型保护,当它不进行类型检查时,错误消息可能会让您了解类型的真正含义。
      【解决方案3】:

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

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

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

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

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

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

      (答案很丑。)

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 2021-06-23
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        相关资源
        最近更新 更多