Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';s标准ML和#x27之间的差异(如果有);s模块系统和OCaml模块系统?_Ocaml_Sml_Ml - Fatal编程技术网

什么';s标准ML和#x27之间的差异(如果有);s模块系统和OCaml模块系统?

什么';s标准ML和#x27之间的差异(如果有);s模块系统和OCaml模块系统?,ocaml,sml,ml,Ocaml,Sml,Ml,我的问题是,标准ML的模块系统和OCaml模块系统之间是否有任何区别?OCaml有函子、属性等的所有支持。。。SML有什么?至于语义学,安德烈亚斯·罗斯伯格(Andreas Rossberg)给出了一个更好、更详细的答案。然而,关于语法可能是您想要的。在功能方面以及语义方面都存在一些差异 功能SML支持但不支持OCaml: 透明签名归属 模块级let 对称共享约束 类型和值上函子的语法糖 OCaml 4的功能包括但不包括SML: 高阶函子 递归模 本地模块 嵌套签名 作为一级值的模块 通用

我的问题是,标准ML的模块系统和OCaml模块系统之间是否有任何区别?OCaml有函子、属性等的所有支持。。。SML有什么?

至于语义学,安德烈亚斯·罗斯伯格(Andreas Rossberg)给出了一个更好、更详细的答案。然而,关于语法可能是您想要的。

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

功能SML支持但不支持OCaml:

  • 透明签名归属
  • 模块级
    let
  • 对称共享约束
  • 类型和值上函子的语法糖
OCaml 4的功能包括但不包括SML:

  • 高阶函子
  • 递归模
  • 本地模块
  • 嵌套签名
  • 作为一级值的模块
  • 通用模块共享(
    sig与模块A=M
  • 模块类型的
然而,一些SML实现提供了其中一些扩展:例如高阶函子(SML/NJ、莫斯科ML、爱丽丝ML)、本地和一级模块(莫斯科ML、爱丽丝ML)、模块共享(SML/NJ、爱丽丝ML)、嵌套签名(莫斯科ML、爱丽丝ML)和递归模块(莫斯科ML)

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

  • 在SML中,函子是生成的,这意味着对同一个参数应用同一个函子两次总是产生新的类型

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

    编辑:OCaml 4添加了可选地使functor生成的功能

  • 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) 模块F(X:sig类型t端)=结构类型u=X.t->单元类型v=X.t端 模块M=F(结构类型t=int end:sig类型t end)
    M
    的类型只是
    sig type u type v end
    ,因此丢失了有关其类型
    u
    v
    之间关系的任何信息,因为这通常不能用表面语法表示


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

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

我认为您应该借此机会了解一下未来的模块系统,或者更准确地说,假设在ML语言的下一次干净迭代中合理地开始了“最近”(主要是您的)对模块系统的研究,这些功能集将发生变化。这会把一个非常有趣的答案变成一个非常有趣的答案。我觉得用这个问题来回答这个问题是不合适的;)。我个人的答案与我上面链接的F-ing模块论文中的内容差不多——它以一种干净且(相当)简单的方式(包括生成函数和应用函数)包含了所有列出的功能,减去递归模块。对于那些我不太确定。OCaml的递归模块对我来说过于特殊和有限,但是一个全面的方法最终将导致放弃构成ML模块的主要部分,正如我们在MixML论文中所描述的那样。“这是否值得,还没有定论。”@fedvasu,是的,传统模块是作为特例出现的,但是,整个系统的特性发生了相当严重的变化。传统的ML模块本质上非常实用(例如,函子是函数,签名是类型的自然概念)。越仔细地观察,MixML方法似乎功能越差,面向对象的程度越高,包括一些需要解决的问题(例如,更复杂、类似对象的原语、模块作为值和类型的混合角色,以及初始化过程中可观察到的副作用)。问题是,这是一个bug还是一个特性@fedvasu,取决于您所指的奥德斯基公司的具体声明。;)We’我们已经足够好了:要么根本不递归(许多人认为这是最好的),要么咬紧牙关,一路走到类似于MixML的地方。我所看到的所有递归模块的特殊概念都会带来更多的问题和/或太过有限,无法承载它们的重量。@StevenShaw,说实话,我自己还没有决定。至于副作用,初始化需要对各个模块体进行评估,这通常是有效的计算。因此,尽管存在递归,但存在一个顺序的、从左到右的求值顺序,这对可能的效果顺序很重要。此外,当递归没有很好的基础时,也就是说,在初始化之前使用了一些值组件,就会出现运行时异常。(虽然这仍然比Java好,比如说,Java,在Java中,你只是默默地得到虚假的“默认”值。)是的,我故意忽略了这一点,因为它被广泛认为是一个过时的特性。它早于基于模块的抽象。