.net - F# 和 op_GreaterThan

标签 .net f# operator-overloading

我最近尝试使用 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/

相关文章:

java - 从 .NET 的角度来看,我需要了解不同版本的 Java 的哪些信息?

c# - Microsoft.WindowsAzure.Storage.StorageException - 服务器正忙

c# - 使用 C# 从 TCP 流中解析串联的、非定界的 XML 消息

f# - 在 F# 元组中使用 CustomComparison 和 CustomEquality 实现自定义比较

c++ - 错误 : pointer being freed was not allocated

c# - .NET Web 服务引用生成的类不适用于 dateTime 类型

visual-studio-2012 - 使用 Visual Studio 编译时如何设置额外的 F# 编译器标志?

c# - 将 C# 结构转换为 F#

c++ - 在 C++ 中,在 STL 容器中存储具有重载 "operator&"的类对象是否合法?

c++ - 为什么 'operator>' 需要 const 而 'operator<' 不需要?