为什么在F#中某些二进制运算符(例如(+),(>),(<))仅接受必须为相同类型的参数,是否有特定原因?

itm*_*nus 4 .net c# f# .net-core

诸如此类的语言C#允许我们编写如下代码:

// C#
Console.WriteLine($"{3 > 2.3}"); // compare an int with a double
Run Code Online (Sandbox Code Playgroud)

但是F#不允许我们这样做。例如,

// F#
printfn "%A" (3 > 4)            // fine
printfn "%A" (3.0 > 4.0)        // fine
printfn "%A" (3 > 4.0)          // wrong 
Run Code Online (Sandbox Code Playgroud)

是否有特别的原因,为什么一些二进制运营商F#一样(+)(>)(<) 只接受参数必须是同一类型?

Vor*_*ato 8

F#不执行隐式类型转换。隐式转换会产生问题,这就是为什么如此多的人对javascript产生不同情绪的部分原因。例如,请欣赏这首经典的JavaScript诗。隐式转换是使这首诗成为可能的基础。

> Array(16).join('wat' - 1) + ' Batman'
'NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN Batman'
Run Code Online (Sandbox Code Playgroud)

3>“ 4”是什么,“ 4”> 3呢?您可能会找到对您有意义的答案,但是有很多有效的方法可以解释隐式转换的含义。在3> 4.0的情况下,此处的歧义可能不太明显,但是,如果您有明确转换的驱动原理,则最好将其普遍应用。