SML和OCaml有什么区别?[关闭]


Answers:


157

有很多差异,有些是技术上的,有些是社会政治上的。我试图先将更重要的差异放在首位。

  • SML是一种具有定义和标准的语言。它是稳定的(实际上已经冻结了,因此无法进化)。Objective Caml是由INRIA的一个小组控制的实现。它继续发展。(IMO的发展得到了很好的管理。)

  • SML有许多实现。骆驼只有一个。

  • Objective Caml具有许多其他功能,其中最突出的可能是对象和多态变体。

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

  • 在语法上有很多差异。

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

  • 类型系统略有不同:在Caml中,e : ty如果类型与的类型ty 统一,则在表达式上接受类型注释e。在SML,e : ty被接受仅当类型ty是一个实例的类型e。这种区别使Caml中的注释在实践中几乎没有用处,因为不可能使用类型注释来坚持表达式是多态的。

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

  • 在SML中,算术运算符被重载以应用于浮点数据和整数数据。在Caml中,操作员不会超载;浮点运算符带有一个额外的点。

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

有关编辑评论的更详细分析,您还可以查看Adam Chlipala的比较页面


4
您忘记了相等性(在OCaml中为不受限制和不安全与在SML中为安全但受限制的相等类型),非通用类型变量(在OCaml中为'_a),printf,在OCaml中将文件名解释为模块名,而在OCaml的stdlib中则更为麻烦。您第二次编写其他含义(实现?)时,编写了两次接口。
JD

1
和OCaml的模式匹配中的or-patterns和guards。
JD

1
请注意,在3.12中,对类型注释的有用性的限制已经有所缓解,在此处注释e : 'a . ty(a)是可能且有意义的。

4
您做出了重要的观察:“ Caml库非常重要”。这似乎渗透了整个哲学,直到在多核硬件上并行实现似乎非常困难甚至不可能。相反,至少有两个并行的SML:Mlton和Poly / ML。
Makarius

2
关于您的第三点,记录名称在OCaml中不再需要唯一性。
PatJ


-3

OCaml添加了面向对象的功能,并且在语法上有一些细微的差别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.