SML和OCaml之间有什么区别?

SML和OCaml之间有什么区别?,ocaml,sml,ml,Ocaml,Sml,Ml,是什么将这两种ML方言区分开来的?OCaml增加了面向对象的功能,并且有一些细微的语法差异。有很多差异,一些是技术上的,一些是社会政治上的。我试着把更重要的区别放在第一位 SML是一种有定义和标准的语言。它是稳定的(事实上已经被冻结,因此无法进化)。目标Caml是由INRIA的一个小组控制的实施。它继续发展。(在我看来,进化管理得很好。) SML有许多实现;Caml只有一个 目的Caml具有许多额外的特征,其中最突出的可能是对象和多态性变体 这两种语言具有截然不同的记录类型模型。简而言之,在C

是什么将这两种ML方言区分开来的?

OCaml增加了面向对象的功能,并且有一些细微的语法差异。

有很多差异,一些是技术上的,一些是社会政治上的。我试着把更重要的区别放在第一位

  • SML是一种有定义和标准的语言。它是稳定的(事实上已经被冻结,因此无法进化)。目标Caml是由INRIA的一个小组控制的实施。它继续发展。(在我看来,进化管理得很好。)

  • SML有许多实现;Caml只有一个

  • 目的Caml具有许多额外的特征,其中最突出的可能是对象和多态性变体

  • 这两种语言具有截然不同的记录类型模型。简而言之,在Caml中,记录字段的名称必须是唯一的,而在SML中,同一作用域中的两种不同记录类型可能具有相同的字段名称。这种怪癖会使从SML到Caml的移植变得有点棘手

  • 有相当多的句法差异

  • 库和标准函数有很大的不同。Caml库非常重要,而SML标准Basis库更具功能性。例如,函数组合是SML中的顶级原语;它不是Caml库的一部分。Caml字符串库不提供折叠功能(至少从3.08版起不提供)。许多Caml
    List
    函数的实现对于很长的列表是不安全的;他们炸了一堆

  • 类型系统略有不同:在Caml中,如果类型
    ty
    e
    的类型一致,则表达式
    e:ty
    上的类型注释是可以接受的。在SML中,只有当类型
    ty
    e
    类型的实例时,才接受
    e:ty
    。这种区别使得Caml中的注释在实践中用处不大,因为不可能使用类型注释来坚持表达式是多态的

  • 与SML相比,Caml在接口(称为模块类型或签名)和(具体)实现(称为模块或结构)之间的关系更理智、更合理。在SML中,几乎任何事情都会发生,您必须依靠程序员来建立良好的约定。在Caml中,编译器建立并执行良好的约定

  • 在SML中,算术运算符被重载以应用于浮点和整数数据。在Caml中,运算符不会过载;浮点运算符用一个额外的点表示

  • 在SML中,程序员可以控制中缀运算符的优先级和关联性。在Caml中,这些由操作员姓名的第一个字符决定。这个限制限制了定义自己的中缀符号的好处


要获得包含编辑评论的更详细的分析,您还可以查看。

您忘记了相等(OCaml中的不受限制和不安全类型与SML中的安全但受限制的相等类型)、非通用类型变量(OCaml中的“a”)、printf、将文件名解释为OCaml中的模块名,在OCaml的stdlib中更常见。第二次是指其他内容(实现?)时,您编写了两次接口。以及模式匹配中的OCaml或模式和保护。请注意,类型注释的有用性限制在3.12中有所缓解,其中注释
e:'a。ty(a)
是可能的,也是有意义的。您有一个重要的观察:“Caml库是非常必要的”。这似乎贯穿了整个理念,以至于在多核硬件上并行实现似乎非常困难甚至不可能。相比之下,至少有两个平行的SML:Mlton和Poly/ML。关于第三点,OCaml中的记录名不再需要唯一性。语法比较: