ML的方言有很多种,最流行的是SML和OCaml。SML 和 OCaml 之间有很多区别,但它们都被认为是 ML 的方言。所以,
- 为什么 SML 和 OCaml 被视为 ML 的方言?
- 如何将一种语言视为 ML 的方言?
- 如果 ML 不是 SML/OCaml,那么 ML 的定义是什么?
我猜 ML 是 SML 和 OCaml 的一些交集,但我找不到一些详细的定义。
ML的方言有很多种,最流行的是SML和OCaml。SML 和 OCaml 之间有很多区别,但它们都被认为是 ML 的方言。所以,
我猜 ML 是 SML 和 OCaml 的一些交集,但我找不到一些详细的定义。
来自 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 都没有类型类。
这不是对您所有问题的详尽答复,但我希望它仍然有所帮助。