29

我是 OCaml 新手。我喜欢 OCaml 的速度,但我并不完全理解它的设计。例如,我希望+运算符是多态的,以支持整数、浮点数等。

为什么我们需要+.

4

3 回答 3

27

我希望“+”运算符是多态的,以支持整数、浮点数等。为什么我们需要'+.'?

很好的问题。这里涉及许多微妙的权衡。

不重载运算符(如在 OCaml 中)的优点是:

  • 类型推断更简单,更可预测。
  • 代码更具可组合性:将代码从一个地方移动到另一个地方不会影响其含义。
  • 可预测的性能:您始终确切知道正在调用哪个函数。

缺点是:

  • 不同运算符的数量很快就会失控:+for int+.for float+/任意精度有理数、+|向量、+||矩阵和复数、低维向量和矩阵、齐次坐标等。

一些替代方案是:

于 2012-03-08T11:07:38.950 回答
12

OCaml 不支持除比较运算符之外的多态运算符(数字或其他)。+vs消除了许多微妙的错误,这些+.错误可能会在来回转换不同大小的整数、浮点数和其他数字类型时出现。这也意味着编译器始终准确地知道正在使用哪种数字类型,从而更容易识别程序员何时对始终具有整数值的数字做出错误假设。要求数字类型之间的显式转换可能看起来很尴尬,但从长远来看,它可能会为您节省更多时间来跟踪奇怪的错误,而不是您必须花费更多时间来编写额外的显式时间。

除了.数字运算符的版本之外,我不认为 OCaml 语法特别奇怪。它非常符合以前的 ML 语言,并为其添加的功能提供了适当且合理的语法扩展。如果你一开始觉得很奇怪,那可能只是表明你到目前为止只使用语法密切相关的语言进行编程。当你学习新的语言时,你会发现有许多不同的方法可以让语言语法具有不同的好处和坏处,但其中很多只是某人决定的任意约定。

于 2011-11-05T04:05:48.033 回答
4

基本上,SML 和 OCaml 的类型系统(忽略对象系统和模块)不支持 ad hoc 多态性。这是一个设计决定。与 SML 不同,OCaml 还决定不将语法糖用于算术。

ML 系列中的某些语言在数值运算符中具有极其有限的特殊多态性形式。例如,(+)在标准 ML 中,默认类型为(int, int) -> int,但(float, float) -> float如果其参数或返回类型已知为,则具有类型float。这些运算符在 SML 中是特殊的,如果尚未内置,则无法定义它们。也不可能赋予其他值具有此属性。val add = (+)会有类型(int, int) -> int。这里的特殊性仅限于语言的语法,不支持类型系统中的临时多态性。

OCaml 有一些具有特殊语义的运算符(但数字运算符不在其中),例如||&&它们是短路的(但如果将它们分配给中间值,则会变成长电路)

let long_circuit_or = (||);;
let print_true x = print_string x; true;;
(* just prints "4" *)
print_true "4" || print_true "5";;
(* prints "45" *)
long_circuit_or (print_true "4") (print_true "5");;
于 2015-12-23T21:56:45.930 回答