首页 文章

什么's the difference (if any) between Standard ML'的模块系统和OCaml模块系统?

提问于
浏览
39

我的问题是,标准ML的模块系统和OCaml模块系统之间是否有任何区别? OCaml是否有所有对仿函数,归属等的支持...... SML有哪些?

2 回答

  • 51

    在功能方面以及语义方面存在一些差异 .

    功能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中,仿函数是适用的,这意味着将相同的仿函数两次应用于完全相同的参数(加上额外的语法限制)会再现等效类型 . 这种语义更灵活,但也可以打破抽象(参见例如我们在this paper,第8节中给出的例子) .

    Edit :OCaml 4增加了可选地使仿函数生成的能力 .

    • OCaml有一个纯粹的语法概念,这意味着某些类型的等价不能由类型系统表示,并且是静默删除的 .

    Edit: 考虑这个例子:

    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的模块类型系统是undecidable(即,类型检查可能不会终止),因为它允许抽象签名,SML不允许这样做 .

  • 2

    至于语义,安德烈亚斯罗斯伯格上面给出了一个更好,更精细的答案 . 但是,关于语法this site可能是您正在寻找的 .

相关问题