SML:使用abstype和使用签名来隐藏结构的实现有什么区别?

Ala*_*lan 16 structure sml signature

我过去在SML做过一些工作,但现在我开始涉及更有趣的部分.

使用该abstype...with...end构造,我可以制作东西,但隐藏其实现细节.我还可以创建我想要制作的东西的签名,并使用:>运算符来构建一个遵循该签名的结构,以保持隐藏实现细节.

签名/结构不仅仅是一种更通用的弃用版本吗?对于签名/结构我不能做的弃用,我该怎么办?为什么我要使用abstype?

在此先感谢您的帮助!

举个例子:

signature SET = sig
    type set
    val empty: set
    val insert: int * set -> set
    val member: int * set -> bool
end

structure Set :> SET = struct
    type set = int list
    val empty = []
    fun insert(x, s) = x::s
    fun member(x, []) = false
      | member(x, h::t) = (x = h) orelse member(x, t)
end
Run Code Online (Sandbox Code Playgroud)

似乎至少和...一样强大

abstype AbsSet = absset of int list with
    val empty = absset([])
    fun insert(x, absset(s)) = absset(x::s)
    fun member(x, absset([])) = false
      | member(x, absset(h::t)) = (x = h) orelse member(x, absset(t))
end
Run Code Online (Sandbox Code Playgroud)

Jes*_*erg 9

为什么我要使用abstype?

从最简单的开始,你不会.至少我无法想出一个很好的理由.


签名/结构不仅仅是一种更通用的弃用版本吗?

好吧,我想我们必须看一下SML的历史.不透明(...:> ...)签名匹配不是SML '90的一部分,正如关于模块1.3.9的 smlnj文档中所解释的那样.不透明签名匹配:>

......其目的是创建签名SIG的"抽象"实例.由于各种原因,这个功能被排除在SML '90之外,但对它的需求是真实的.

我不知道不包括它的原因,但据我所知,McQueen是SML '90的一部分的抽象类型的"更远",并且由于某些原因在SML '97中没有删除(可能是向后兼容性) ?)

然而,它们之间存在根本区别,abstype是核心语言的一部分,其中模块/签名/仿函数是模块系统的一部分.


对于签名/结构我不能做的弃用,我该怎么办?

我无法想出任何东西.但是我很确定构建一些可以使用不透明签名匹配的示例很容易,而不能使用abstype.


UPDATE

从后继-ml wiki 将页面Degrade abstype转换为派生形式实际上包含一个关于abstype作为剩余的非正式描述.

与许多其他人一样,他们也参考了标准ML文件修订定义中的缺陷部分,其中包含有关定义中某些"次要"错误/缺陷的详细信息abstype,尽管它们的链接已经死亡."标准ML的修订定义"是SML '97的定义.

  • 你可以用 abstype 做的唯一一件你不能用模块做的事情(至少在普通的 SML'97 中)是在“let”中本地定义一个抽象类型。但这并不是任何人都感到迫切需要的东西...... (2认同)