2

为什么覆盖相等和比较运算符以产生除 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
4

1 回答 1

1

比较和相等运算符 ( <, >, =) 具有明确定义的行为 (规范 §8.15.6 )。具体来说,比较取决于IComparable实现,相等取决于Equals.

与 C# 中的同名运算符只有短暂的相似之处。您仍然可以提供具有非传统行为的 C# 变体,以便在其他 .NET 语言中使用

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

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

于 2013-02-27T23:23:03.160 回答