为什么OCaml(+)不是多态的?

z_a*_*xis 27 polymorphism ocaml addition

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

我们为什么需要+.

Jon*_*rop 25

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

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

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

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

缺点是:

  • 不同运算符的数量很快就会失控:+for int,+.for float,+/for any-precision-rational,+|vector,+||for matrix,of matrix and complex number,low-dimensional vector and matrices,homogeneous coordinate.

一些替代方案是:

  • 无需在运行时解析类型类.还有一些编译指示可以保证编译时的解析.类型类方法可以带有意义,因此代码不应该在不同的上下文中改变含义.类型推断也是可预测和全面的.顺便提一下,问题不仅在于操作员的爆炸,而且编写通用代码也很困难.使用多态运算符的函数比硬编码到某种类型的函数更有用,更可重用. (3认同)

Kei*_*win 11

Ocaml不支持比较运算符以外的多态运算符(数字或其他).在++.事去掉了很多微妙的错误的,可以在转换整数的大小不同突然出现,花车,和其他数字类型来回.这也意味着编译器总是确切地知道正在使用哪种数字类型,因此更容易识别程序员何时对一个始终具有整数值的数字做出错误的假设.要求在数字类型之间进行显式转换可能看起来很尴尬,但从长远来看,它可能会为您节省更多时间来追踪奇怪的错误,而不是花费额外的时间来明确表示.

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

  • "+与+.事物消除了许多微妙的错误".如果这是真的,F#代码将遭受那些微妙的错误,但事实并非如此.实际上,错误几乎完全是由隐式转换(例如2.3/0或1/12*123.456)引起的,而不是由重载造成的.F#不进行隐式转换,即`+`是`int - > int - > int`或`float - > float - > float`但不是`int - > float - > float`.因此,这不是OCaml选择的有效动机. (17认同)
  • 只有在您开始计算F#必须执行的所有其他折衷以支持此重载之前,此参数才合理. (3认同)