【问题标题】:What's the difference (if any) between Standard ML's module system and OCaml module system?Standard ML 的模块系统和 OCaml 模块系统有什么区别(如果有的话)?
【发布时间】:2013-03-13 03:58:53
【问题描述】:

我的问题是,Standard ML 的模块系统和 OCaml 的模块系统有什么区别吗? OCaml 是否支持 SML 所具有的 functors 、 ascriptions 等...?

【问题讨论】:

    标签: ocaml sml ml


    【解决方案1】:

    至于语义,上面的 Andreas Rossberg 给出了一个更好、更详尽的答案。但是,关于语法 this site 可能是您正在寻找的。​​p>

    【讨论】:

      【解决方案2】:

      在功能方面和语义方面存在一些差异。

      SML 支持但不支持 OCaml 的功能:

      • 透明签名归属
      • 模块级let
      • 对称共享约束
      • 类型和值之上的函子的语法糖

      OCaml 4 有但没有 SML 的功能:

      • 高阶函子
      • 递归模块
      • 本地模块
      • 嵌套签名
      • 模块作为一等值
      • 通用模块共享(sig with module A = M)
      • module type of

      一些 SML 实现提供了其中一些作为扩展,但是:例如高阶函子(SML/NJ、Moscow ML、Alice ML)、本地和一流模块(Moscow ML、Alice ML)、模块共享(SML/NJ、Alice ML)、嵌套签名(Moscow ML、Alice ML) , 和递归模块 (Moscow ML)。

      在语义方面,最大的区别在于类型等价的处理,尤其是在函子方面:

      • 在 SML 中,函子是生成的,这意味着将相同的函子两次应用于相同的参数总是会产生新的类型。

      • 在 OCaml 中,函子是可应用的,这意味着将相同的函子两次应用于完全相同的参数(加上额外的句法限制)会重现等效类型。这种语义更灵活,但也可能破坏抽象(参见例如我们在this paper,第 8 节中给出的示例)。

        编辑:OCaml 4 添加了选择性地使函子生成的能力。

      • OCaml 有一个纯语法的签名概念,这意味着某些类型等价不能被类型系统表达,并且会被默默地丢弃。

        编辑:考虑这个例子:

        模块 F (X : sig type t end) = struct type u = X.t -> unit type v = X.t end 模块 M = F (结构类型 t = int end : sig type t end)

        M 的类型只是 sig type u type v end,因此丢失了有关其类型 uv 之间关系的任何信息,因为这通常不能用表面语法来表达。

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

      【讨论】:

      • 我认为您应该借此机会了解一下未来模块系统,或者更准确地说,假设“最近”的合理开始,这些功能集将改变的方式(主要是你的)在 ML 语言的下一次干净迭代中研究模块系统。这会将一个非常有趣的答案变成一个非常有趣的答案。
      • 我觉得为此背负这个问题是不合适的;)。我个人的回答几乎就是我在上面链接的 F-ing 模块论文中的内容——它以一种干净且(相当)简单的方式(包括生成和应用函子)包含所有列出的功能,减去递归模块。对于那些我不太确定的人。 OCaml 的递归模块对于我的口味来说过于临时和有限,但是正如我们在 MixML 论文中所描述的那样,全面的方法最终将导致放弃构成 ML 模块的主要部分。是否值得,目前尚无定论。
      • @fedvasu,是的,传统模块是作为特殊情况出现的,但是,整个系统的特性发生了相当大的变化。传统的 ML 模块本质上是非常实用的(例如,函子作为函数,签名作为自然的类型概念)。 MixML 方法看起来功能更少,更面向对象,包括一些问题(例如更复杂的、类似对象的原语、模块作为值和类型的混合角色,以及在初始化中可观察到的副作用)。问题是,这是错误还是功能? ;)
      • @fedvasu,取决于您所指的 Odersky 的具体声明。 ;) 足够好:要么根本没有递归(许多人认为无论如何都更可取),要么咬紧牙关,一路走来类似于 MixML 的东西。我见过的所有递归模块的特别概念都会引入更多问题和/或过于有限,无法承担恕我直言。
      • @StevenShaw,老实说,我自己还没有决定。至于副作用,初始化需要评估各个模块主体,这通常是有效的计算。因此,尽管递归,有一个顺序的、从左到右的评估顺序对可能的影响的顺序很重要。此外,当递归证明没有充分根据时,您会遇到运行时异常,即在初始化之前使用了某些值组件。 (尽管这仍然比 Java 更好,Java 只是默默地获取虚假的“默认”值。)
      【解决方案3】:

      SML 中还有 abstype 工具,它类似于数据类型工具,只是它隐藏了数据类型的结构。 OCaml 依赖于模块抽象来完成所有必要的隐藏。请注意,this site 没有在 SML 中提及此功能。

      【讨论】:

      • 是的,我故意忽略了它,因为它被广泛认为是一个过时的功能。它早于基于模块的抽象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2022-12-20
      • 2014-04-03
      • 2014-11-04
      相关资源
      最近更新 更多