0

私は判別共用体を持っており、そのような組み込み演算子を使用したいと考えて> < compare maxいます。

[<CustomComparison>]
type SymbolType = 
    | A
    | B
    | C
    | D

    interface IComparable<SymbolType> with
        member x.CompareTo y =
            match x, y with
            | A, A-> 0
            | A, _ -> 1
            | _, A-> -1
            | _, _ -> 0

を使用できることは理解IComparableしていますが、チェックを行う必要があります。nullさらに悪いことに(SymbolType) y、時間がかかると思われるようにキャストする必要があります。

4

3 に答える 3

3

型に対して標準の比較演算子を既に使用できます。組み込みの実装では、個々のケースの宣言の順序が使用されるため、次のようになります。

type SymbolType =  A | B | C | D 

// Behavior of built-in comparison
A < B   = true
D <= C  = false
max B D = D

これは非常に壊れやすいように見えるので、頼りにするのが最善ではないかもしれません。他の値を含まないケースがある場合は、判別共用体の代わりに列挙型を使用して、必要な順序を定義できます。

type SymbolType =  
  | A = 1
  | B = 2
  | C = 4
  | D = 3

// The order is now defined by your code
SymbolType.C < SymbolType.D = false
于 2012-10-05T13:41:44.983 に答える
1

必要なメソッドをシン ラッパーで実装するだけです。

[<CustomComparison>] 
[<CustomEquality>] 
type SymbolType = 
    | A
    | B
    | C
    | D
    override x.Equals y =
       match y with
       | :? SymbolType as t -> (((x :> IComparable<_>).CompareTo) t)=0
       | _ -> false
    interface IComparable with
        member x.CompareTo y =
            match y with
            | :? SymbolType as t -> ((x :> IComparable<_>).CompareTo) t
            | _ -> failwith "bad comparison"
    interface IComparable<SymbolType> with
        member x.CompareTo y =
            match x, y with
            | A, A-> 0
            | A, _ -> 1
            | _, A-> -1
            | _, _ -> 0

この方法により、重複入力を回避できます。

于 2012-10-05T11:11:48.410 に答える
0

CLR では、演算子は静的関数であるため、インターフェイスで定義できません。ただし、インターフェイスをジェネリック関数の型パラメーターの制約として使用すると、ボックス化も回避できます。

int Compare<T>(T lhs, T rhs) where T : IComparable<T>
{
  return lhs.CompareTo(rhs) // no boxing
}

申し訳ありませんが、私は F# に詳しくないので、C# で例を書きました。

于 2012-10-05T11:18:44.310 に答える