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 に答える