c# - 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#
为什么像(+)
,(>)
中的某些二元运算符(<)
只接受必须是相同类型的参数是否有特殊原因?
解决方案
F# 不进行隐式类型转换。隐式转换会产生问题,这也是为什么这么多人对 javascript 情绪复杂的部分原因。例如,请欣赏这首经典的 javascript 诗。隐式转换是使这首诗成为可能的基础。
> Array(16).join('wat' - 1) + ' Batman'
'NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN Batman'
什么是3>“4”,“4”>3呢?你可能有对你有意义的答案,但是有很多有效的方法来解释隐式转换应该是什么。对于 3 > 4.0,此处的歧义可能不那么明显,但是当您有显式转换的驱动理念时,最好将其普遍应用。
推荐阅读
- bash - 从 bash 中的命令输出检查 2 列的值
- mongodb - Mongo Union All 在好友表中查找某人的好友
- android - 如何保护我的移动应用程序的云数据库?
- c++ - 为什么 wxCrafter Hello World 程序不起作用?[C++, wxWidgets]
- json - 如何将json数据重塑为另一种格式
- javascript - 对对象数组进行排序并创建具有公共值的新数组
- laravel - 提交表单Laravel 6后意外注销
- python - 如何从 Python 函数返回多个变量
- php - 从 pdo 结果中获取值
- java - 将 if 语句转换为三元运算符 - 编译器抱怨它不是语句