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
が存在するようですが、指定する必要はありません。なぜですか?それは大きな違いではありませんが、違いはなぜここにあるのだろうかと思っていました。