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

时间:2010-11-06 02:45:23

标签: f#

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

sqrt 4      // Won't compile.

我没有看到隐含地将int 4转换为float的问题,这是sqrt所需要的。

有人能说清楚这个吗?

3 个答案:

答案 0 :(得分:13)

因为它的类型检查器几乎取决于经典的强类型重建。您的示例需要通过隐式强制转换或弱类型系统实现类型的强制,但在这种类型推断中不允许这些类型。

由于 F#来自OCaml,它有一个类型重建,试图通过非常迂腐来保证程序的正确性:算法尝试将整个类型的程序统一到一个良好的类型,这如果弱类型规则允许考虑像float这样的整数,则无法完成。

答案 1 :(得分:7)

另见

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

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

答案 2 :(得分:5)

除了上述答案之外,整数和浮点数之间的类型转换在计算方面是not actually free;如果您的目标是编写高性能代码,编译器通过“隐藏”它们来帮助您。这是我喜欢的OCaml和F#之一:即使它们非常高级,你仍然需要知道你正在做什么计算。