为什么不';F#中是否存在隐式转换?

为什么不';F#中是否存在隐式转换?,f#,F#,F#不支持隐式转换。我知道这是一个特性,但我不明白为什么即使没有信息丢失,也禁止隐式转换。例如: sqrt 4 // Won't compile. 我认为将int4隐式转换为float,这是sqrt所需要的,没有问题 有人能解释一下吗?因为它的类型检查器几乎依赖于经典的强类型重构。您的示例需要强制类型,这可以通过隐式强制转换或弱类型系统实现,但在这种类型推断中不允许这样做 < f<< /强>来自OcAML,它有一种类型的重构,它试图通过极端迂腐的方式来保证程序的正确性:该算法试图将

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

sqrt 4      // Won't compile.
我认为将
int
4隐式转换为
float
,这是
sqrt
所需要的,没有问题


有人能解释一下吗?

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

< <强> f<< /强>来自OcAML,它有一种类型的重构,它试图通过极端迂腐的方式来保证程序的正确性:该算法试图将整个类型的程序统一为一个好的类型,如果弱类型规则允许考虑一个像浮点的整数,则不能这样做。

也见


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

除了上述答案之外,整数和浮点之间的类型转换是以计算方式进行的;如果您的目标是编写高性能代码,那么编译器对您“隐藏”它们并不是在帮您的忙。这是我喜欢OCaml和F#的地方之一:即使它们是非常高的级别,您仍然需要确切地知道您在做什么计算

你的意思是,“…考虑一个像浮子一样的整数”吗?是的,也就是说,如果这个点可以反转为相反的情况(加宽或限制数字类型),那么最好是说,拥有较弱类型的规则,会导致编译器不得不处理的更大的搜索空间来证明类型是全部的。“逻辑正确”。@IanRingrose:这不是性能问题,而是一个精确的设计choice@Jack,我更希望更大的搜索空间将使编写一个以可靠和可理解的方式工作的编译器变得不可能。因此,不允许这样做是一个非常好的精确设计选择。(直到像TypeScript这样的系统从操作方向解决问题。)