在Module上SML的signature中添加变量类型绑定有啥影响?

Posted

技术标签:

【中文标题】在Module上SML的signature中添加变量类型绑定有啥影响?【英文标题】:What is the effect of adding a variable type binding in signature in SML on the Module?在Module上SML的signature中添加变量类型绑定有什么影响? 【发布时间】:2022-01-10 15:29:55 【问题描述】:

在以下代码中:

signature DIGIT = 
sig
  type digit
  val make_digit : int -> digit
  val increment : digit -> digit
  val decrement : digit -> digit
  val down_and_up : digit -> digit
  val test : digit -> unit
end

structure Digit :> DIGIT =
struct
  type digit = int
  exception BadDigit
  exception FailTest
  fun make_digit i = if i < 0 orelse i > 9 then raise BadDigit else i
  fun increment d = if d=9 then 0 else d+1
  fun decrement d = if d=0 then 9 else d-1
  val down_and_up = increment o decrement (* recall o is composition *)
  fun test d = if down_and_up d = d then () else raise FailTest
end

我在 SML 编译器中针对两种不同情况运行 Digit.test 10;,即上述代码中的 type digit 行:

    如果是type digit
Error: operator and operand don't agree [overload conflict]
  operator domain: Digit.digit
  operand:         [int ty]
    如果是type digit = intuncaught exception FailTest

我的问题很简单,当我们插入= int 以使输出/错误不同时有什么区别?

【问题讨论】:

【参考方案1】:

第一个是类型错误,因为您没有指定 digit 类型在这个结构中是什么。

第二个引发异常作为运行时错误,因为increment (decrement 10) 为 0。

(我认为这是一个设计问题,您可以将任何功能与任何int 一起使用,而不仅仅是已通过make_digit 验证的东西。)

【讨论】:

以上是关于在Module上SML的signature中添加变量类型绑定有啥影响?的主要内容,如果未能解决你的问题,请参考以下文章

如何添加变换算法(“envelope-signature”)

串并行数据结构实验--MAC下SML环境安装1

让 SML 中的绑定和动态范围

SML/NJ - 使用 foldr 的一种线长函数

为啥这个 SML 代码评估为 7 而不是 6?

SML,如何查找列表中最小数量的出现次数?