F#不支持隐式转换。我知道这是一个功能,但我不明白为什么即使没有信息丢失也禁止隐式转换。例如:
sqrt 4 // Won't compile.
我没有看到隐含地将int
4转换为float
的问题,这是sqrt
所需要的。
有人能说清楚这个吗?
答案 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#之一:即使它们非常高级,你仍然需要知道你正在做什么计算。