14

ML的方言有很多种,最流行的是SML和OCaml。SML 和 OCaml 之间有很多区别,但它们都被认为是 ML 的方言。所以,

  1. 为什么 SML 和 OCaml 被视为 ML 的方言?
  2. 如何将一种语言视为 ML 的方言?
  3. 如果 ML 不是 SML/OCaml,那么 ML 的定义是什么?

我猜 ML 是 SML 和 OCaml 的一些交集,但我找不到一些详细的定义。

4

1 回答 1

8

来自 camlspotter 的链接很好地概述了 ML 历史,并提到了 Luca Cardelli 的一个实现,称为“Cardelli 的 ML”。我为此四处寻找,发现了这篇论文:ML under Unix。Luca Cardelli 描述了“ML”的实现,我很确定这将早于标准 ML,因为它的日期为 1983 年。这是摘要中的功能列表:

  • 交互的
  • 强类型
  • 多态类型系统
  • 抽象数据类型
  • 例外
  • 模块

这是一个很好的列表,尽管有些部分似乎不清楚。我认为这个列表可以作为一种语言应该具有哪些特征才能被“视为 ML”的非正式定义,但是有几件事值得注意。

系统“交互式”的要求是一个有点挑剔的实现细节,可能特定于本文中描述的实现。标准 ML 编译器 MLton 没有交互式 REPL(因为它是一个全程序优化编译器),但我怀疑是否有人认真建议 MLton 实现的语言不是 ML。

此外,“强类型”相当模糊,因此值得阅读该段的其余部分以获得更多上下文:

每个 ML 表达式都有一个类型,该类型是静态确定的。表达式的类型通常由系统自动推断,无需类型定义。ML 类型系统保证任何可以键入的表达式在运行时都不会产生类型错误。静态类型检查在编译时会捕获程序中的大部分错误。

这个列表也根本没有提到模式匹配,但是这篇论文确实涵盖了模式匹配,虽然我不知道 LCF 中使用的 ur-ML 是否有模式匹配,如果没有,如果没有它,如何操作数据类型. 我认为,在 2013 年,具有这些功能但缺乏模式匹配的语言将很难作为 ML 销售。

请注意,Haskell 大多符合这个列表,如果你眯着眼睛看的话。但在实践中,它的分歧足够大,以至于我认为大多数人认为 Haskell 是受 ML 启发的,但“不是 ML”,主要是因为 Haskell 是纯粹的和懒惰的,而 ML 在历史上是不纯的和严格的。此外,SML 和 OCaml 中的 ML 模块系统与 Haskell 的有很大不同,并且两种 ML 都没有类型类。

这不是对您所有问题的详尽答复,但我希望它仍然有所帮助。

于 2013-07-27T17:37:19.697 回答