为什么SML和OCaml被认为是ML的方言? ML的定义是什么?

时间:2013-07-25 05:41:57

标签: programming-languages ocaml sml

ML有很多方言,而SML和OCaml是最受欢迎的方言。 SML和OCaml之间存在许多差异,但它们都被视为ML的方言。 所以,

  1. 为什么SML和OCaml被认为是ML的方言?
  2. 如何将语言视为ML的方言?
  3. 如果ML不是SML / OCaml,ML的定义是什么?
  4. 我猜ML是SML和OCaml的交集,但我找不到一些详细的定义。

1 个答案:

答案 0 :(得分:7)

来自camlspotter的链接对ML历史有一个很好的概述,并提到了Luca Cardelli称为“Cardelli的ML”的实现。我为此探讨了一下,发现了这篇论文:ML under Unix。 Luca Cardelli描述了一个“ML”的实现,我很确定这将早于1983年的标准ML。这是摘要中的特征列表:

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

这是一个相当不错的清单,尽管有些部分似乎不清楚。我认为这个列表可以作为语言应该具有什么特征的非正式定义,以便被“视为一个ML”,但是有一些值得注意的事情。

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

此外,“强类型”非常模糊,因此有必要阅读该段的其余部分以获取更多背景信息:

  

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

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

请注意,如果稍微眯一下,Haskell大多符合此列表。但实际上它的分歧很多,我认为大多数人都认为Haskell受到ML的启发,但“不是ML”,主要是因为Haskell是 lazy ,而ML历来是不纯严格。此外,在SML和OCaml中,ML模块系统与Haskell有很大不同,并且两个ML都没有类型类。

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