使用非Bool返回类型重载Equality和Comparison Operators

时间:2013-02-27 22:56:34

标签: f#

是否有一个特定的原因,为什么覆盖相等和比较运算符以生成除bool之外的类型是如此困难。

下面我有一个解决方法,但为什么语言不能让这更容易呢?

我在这里工作的是一个外部库,已经重载了这些运算符,我只是希望它们在F#中以相同的方式工作。为了实现这一点,我必须这样做才是正确的。

type ATArrayLT = ATArrayLT with
    static member        (?<-) (x:ATArray, ATArrayLT, y:int    ) = ATArray.op_LessThan(x, float32 y)
    static member        (?<-) (y:int    , ATArrayLT, x:ATArray) = ATArray.op_LessThan(x, float32 y)        
    static member        (?<-) (x:ATArray, ATArrayLT, y:float32) = ATArray.op_LessThan(x, y)
    static member        (?<-) (y:float32, ATArrayLT, x:ATArray) = ATArray.op_LessThan(x, y)
    static member        (?<-) (x:ATArray, ATArrayLT, y:ATArray) = ATArray.op_LessThan(x, y)
    static member inline (?<-) (x        , ATArrayLT, y        ) = x < y

let inline (<) x y = x ? (ATArrayLT) <- y

1 个答案:

答案 0 :(得分:1)

比较和相等运算符(<>=)具有明确定义的行为(spec §8.15.6)。具体而言,比较取决于IComparable实施,而平等取决于Equals

C#中同名的运营商只有相似之处。您仍然可以提供C#变体,以及非传统行为,以便从其他.NET语言中使用

type T() =
  static member op_LessThan (a: T, b: T) = new obj()

但它们对F#的相等和比较运算符没有影响。