2017-04-11 12 views
1

F#に型Symbolを実装したいと思います。これには、関連する文字列と位置があります(テキスト内の行番号を考えてみましょう)。私は次のようにします:F#でCustomEqualityとCustomComparisonの2つの異なる構文があるのはなぜですか?

type Symbol = Symbol of string * int // (string, line number) 

行番号を却下するカスタム等価が必要です。私は行番号を考慮した "厳密な平等"を持っていますが、私は文字列だけを比較するデフォルトの等価をします。 this SO postを見ると、1つが、以下のように関係しているようだ:

[<CustomEquality; CustomComparison>] 
type Symbol = 
    | Symbol of string * int 
    member x.GetString() = 
     match x with 
     | Symbol (s, _) -> s 
    override x.Equals(y) = // Equality only compares strings, not positions. 
     match y with 
     | :? Symbol as i -> i.GetString() = x.GetString() 
     | _ -> false 
    override x.GetHashCode() = 
     match x with 
     | Symbol (s, p) -> hash (s, p) 

はしかし、カスタム比較を実装するために、人はなぜ、私はoverride x.Equals(y)...を書くことはできませんが、

interface System.IComparable with 
     member x.CompareTo(yobj) = 
      match yobj with 
      | :? Symbol as y -> compare (x.GetString()) (y.GetString()) 
      | _ -> invalidArg "yobj" "cannot compare values of different types" 

上記の宣言の下を追加する必要があります override x.CompareTo(yobj)...?なぜ interface System.IComparable with ...を指定する必要がありますか? System.IEquatableが存在するようですが、指定する必要はありません。なぜですか?それは大きな違いではありませんが、違いはなぜここにあるのだろうかと思っていました。

答えて

2

違いは、EqualsではObject.Equalsをオーバーライドしています。これは基本クラスの仮想メソッドですが、CompareToではインターフェイスを実装しています(F#では "interface .. "

関連する問題