为什么F#中没有隐式转换?

roy*_*yco 8 f#

F#不支持隐式转换.我知道这是一个功能,但我不明白为什么即使没有信息丢失也禁止隐式转换.例如:

sqrt 4      // Won't compile.
Run Code Online (Sandbox Code Playgroud)

我没有看到隐含地将int4 转换为a的问题float,这是sqrt需要的.

任何人都可以阐明这一点吗?

Jac*_*ack 13

因为它的类型检查器几乎取决于经典的强类型重建.例如,您需要强制的种类是有可能通过隐式转换或弱类型的系统,但这些都不是在这种类型推断的允许.

由于F#来自OCaml,它有一个类型重建,试图通过非常迂腐来保证程序的正确性:算法试图将整个类型的程序统一到一个良好的类型,如果弱类型规则允许,这是不可能做到的考虑像浮点数这样的整数.


Bri*_*ian 7

也可以看看

http://lorgonblog.wordpress.com/2009/10/25/overview-of-type-in​​ference-in-f/

它描述了重载如何与类型推断相互作用.隐式转换会导致许多与重载相同的问题,并且与错误诊断的交互也很差.


Gai*_*ius 5

除了上面的答案,整数和浮点数之间的类型转换在计算方面实际上并不是免费的.如果您的目标是编写高性能代码,那么编译器并不会帮助您"隐藏"它们.这是我喜欢的OCaml和F#之一:即使它们非常高级,你仍然需要知道你正在做什么计算.