我的问题是,标准ML的模块系统和OCaml模块系统之间是否有任何区别?OCaml是否有所有对仿函数,归属等的支持...... SML有哪些?
And*_*erg 54
在功能方面以及语义方面存在一些差异.
功能SML支持但不支持OCaml:
let功能OCaml 4有但不是SML:
sig with module A = M)module type of然而,有几个SML实现提供了一些扩展,例如:高阶仿函数(SML/NJ,莫斯科ML,Alice ML),本地和一等模块(莫斯科ML,Alice ML),模块共享(SML/NJ, Alice ML),嵌套签名(莫斯科ML,Alice ML)和递归模块(莫斯科ML).
语义学方面,最大的区别在于类型等价的处理,特别是对于仿函数:
在SML中,仿函数是生成的,这意味着将相同的仿函数应用于同一个参数总是产生新的类型.
在OCaml中,仿函数是适用的,这意味着将两个相同的仿函数应用于完全相同的参数(加上额外的语法限制)会再现相同的类型.这种语义更灵活,但也可以打破抽象(参见我们在本文中给出的例子,第8节).
编辑:OCaml 4增加了可选地使仿函数生成的能力.
OCaml具有纯粹的语法概念,这意味着类型系统无法表达某些类型的等价,并且会被静默删除.
编辑:考虑这个例子:
module F (X : sig type t end) = struct type u = X.t -> unit type v = X.t end module M = F (struct type t = int end : sig type t end)
类型M是简单sig type u type v end,也因此失去了关于其类型之间的关系的任何信息u和v,因为一般不能在表面语法表达.
另一个显着的区别是OCaml的模块类型系统是不可判定的(即,类型检查可能不会终止),因为它允许抽象签名,SML不允许.