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)
为什么我要使用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的定义.