F#如何从OCaml"+"中删除很多微妙的bug?

MiP*_*MiP 10 polymorphism f# ocaml functional-programming operator-overloading

为什么OCaml的(+)不是多态的?,基思说:

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

ygrek还说:

你开始计算F#必须做的所有其他妥协,以支持这种重载.

有人可以解释一下OCaml中存在的"很多微妙的错误"以及F#除了发明解决方案静态解析类型之外还要做什么"所有妥协"?

Jon*_*rop 6

有人可以解释一下OCaml中存在的"很多微妙的错误"

OCaml中不存在错误.它们以C语言存在,并通过区分不同的数字类型在OCaml中修复.然而,正如Keith后来提到的那样,问题不是算术运算符过载而是所谓的"促销".你可以摆脱升级,但仍然有重载的算术运算符(F#做到这一点,它的效果非常好).

除了发明解决方法静态解析类型之外,F#必须做的"所有妥协"是什么?

两个极端不像OCaml那样重载或者像Haskell中的类型类那样完全重载.两种极端都有缺点.F#选择了一个中间地带,其中一些运算符和函数可以被重载但其他运算符和函数不能,并且必须在编译时解决所有重载.这比OCaml或Haskell解决方案更复杂,但它是一个务实的权衡:您可以获得可预测的快速简单代码.但是,类型推断更复杂(你必须指定类型一些),代码不再编写(切割和粘贴代码会导致不同的类型被推断,破坏代码),你需要记住什么可以重载和什么不能.