F#"如何消除许多微妙的错误"来自OCaml" +"?

时间:2017-05-14 11:11:39

标签: f# functional-programming polymorphism operator-overloading ocaml

来自Why is OCaml's (+) not polymorphic?Keith said

  

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

ygrek也说:

  

你开始计算F#为支持这种重载而必须做的所有其他妥协。

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

1 个答案:

答案 0 :(得分:5)

  

有人可以解释一下是什么"很多微妙的错误"它存在于OCaml

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

  

什么是"所有妥协"哪个F#除了发明解决方法静态解析类型之外还要做什么?

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