- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近尝试使用 Microsoft Solver Foundation Services 在 F# 中编写一些东西,在这样做的同时我遇到了一个问题:我必须表达一个 (Term > Term) 条件,在 C# 中可以简单地表示为 t1 > t2 和返回另一个 Term 对象。相反,在 F# 中,我必须调用 Term.op_GreaterThan 才能获得与使用 t1 > t2 会产生 bool 值而不是术语相同的结果。
现在我想知道为什么 F# 只选择 op_GreaterThan 如果它产生一个 bool 值?
当 Term 没有实现 IComparable 时,F# 对 t1 > t2 的解释有什么意义?
请注意,我理解为什么基于结构比较概念在平等和整体平等的情况下做这样的事情,我只是不明白如何将其扩展到“大于”/“小于”比较。
最佳答案
教科书答案:
运算符重载不是公共(public)语言规范的一部分,这意味着编译器编写者可以随意忽略或仅部分支持它,如果他们愿意的话。作为图书馆作者,您有责任为人们提供与类(class)合作的替代方式。
务实的回答:
因为一开始做这件事就是一件愚蠢的事。显式创建了 op_GreaterThan 方法以进行比较。也就是说,你不应该用它做“有趣”的事情,比如连接两个术语。 CLR 只允许你滥用它,因为它需要支持像 C++ 这样的遗留语言。
顺便说一句,有一个重载专门用于将两个东西连接在一起。它被称为 op_Concatenate。你真的应该考虑使用它而不是 op_GreaterThan。
编辑
几乎是好的答案:
在 F# 中,我提到的连接运算符是 ^。
我称这为几乎不错的答案,因为我不太确定 C# 是否支持它。我认为它只允许在 VB 和 F# 中使用。
编辑#2
看来 F# 毕竟不尊重 ^ 重载。
编辑#3
WTF在这里进行吗? F# 根本不尊重 > 运算符。当然你可以重载它,它会正确地发出 op_GreaterThan 方法,但它会忽略它。它甚至不尝试使用 op_GreaterThan,而是寻找 System.IComparable 接口(interface)。
更糟糕的是,这是一个运行时检查。即使它可以静态确定类 Foo 没有实现 IComparable,它仍然会继续编译代码。
关于.net - F# 和 op_GreaterThan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966032/
我最近尝试使用 Microsoft Solver Foundation Services 在 F# 中编写一些东西,在这样做的同时我遇到了一个问题:我必须表达一个 (Term > Term) 条件,在
我是一名优秀的程序员,十分优秀!