首页 > 解决方案 > F# 中的某些二元运算符(如 (+) 、 (>) 、 (<) )只接受必须是相同类型的参数是否有特殊原因?

问题描述

像这样的语言C#允许我们编写如下代码:

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

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

// F#
printfn "%A" (3 > 4)            // fine
printfn "%A" (3.0 > 4.0)        // fine
printfn "%A" (3 > 4.0)          // wrong 

F#为什么像(+),(>)中的某些二元运算符(<) 只接受必须是相同类型的参数是否有特殊原因?

标签: c#.net.net-coref#

解决方案


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

> Array(16).join('wat' - 1) + ' Batman'
'NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN Batman'

什么是3>“4”,“4”>3呢?你可能有对你有意义的答案,但是有很多有效的方法来解释隐式转换应该是什么。对于 3 > 4.0,此处的歧义可能不那么明显,但是当您有显式转换的驱动理念时,最好将其普遍应用。


推荐阅读