标准ML的模块系统和OCaml模块系统之间有什么区别(如果有的话)?

Dra*_*gno 41 ocaml ml sml

我的问题是,标准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,也因此失去了关于其类型之间的关系的任何信息uv,因为一般不能在表面语法表达.

另一个显着的区别是OCaml的模块类型系统是不可判定的(即,类型检查可能不会终止),因为它允许抽象签名,SML不允许.

  • 我认为您应该借此机会了解一下*future*模块系统,或者更确切地说,假设在下一次干净迭代中对模块系统进行"最近"(主要是您的)研究的合理开始,这些功能集将会发生变化一种ML语言.这将把一个非常有趣的答案变成一个非常有趣的答案. (4认同)
  • 我认为背负这个问题是不恰当的;).我个人的回答几乎就是上面链接的F-ing模块文件中的内容 - 它以干净和(相当)简单的方式(包括生成和应用函子)包含所有列出的特征,减去递归模块.对于那些我不太确定的人.OCaml的递归模块太过于特殊,而且仅限于我的口味,但是综合方法最终会导致放弃构成ML模块的主要部分,正如我们在MixML论文中所描述的那样.陪审团仍然不清楚它是否值得. (4认同)
  • @fedvasu,是的,传统模块作为特殊情况出现,但是,整个系统的特征变化非常严重.传统的ML模块本质上非常实用(例如,函子作为函数,签名作为自然的类型概念).MixML方法看起来功能较少,面向对象越近,包括一些需要解决的问题(例如,更复杂,类似对象的原语,模块作为值和类型的混合角色,以及初始化中的可观察副作用).问题是,是一个bug还是一个功能?;) (2认同)
  • @fedvasu,取决于您所指的Odersky的具体陈述.;)足够好:要么根本没有递归(许多人认为这是最好的选择),或者咬紧牙关并且一路走到类似于MixML的东西.我所看到的递归模块的所有临时概念都引入了更多的问题和/或太受限制以承载它们的重量IMHO. (2认同)