관련 문자열과 위치가있는 F #에 Symbol
유형을 구현하고 싶습니다 (텍스트의 줄 번호를 가정 해 봅시다). 다음과 같이 할 것입니다 :F #의 CustomEquality와 CustomComparison에 대해 서로 다른 두 가지 구문이있는 이유는 무엇입니까?
type Symbol = Symbol of string * int // (string, line number)
줄 번호를 닫는 사용자 지정 같음을 원합니다. 줄 번호를 고려한 "엄격한 평등"을 갖겠지 만 문자열 만 비교하는 기본 동등성을 원합니다. this SO post 보면, 그것은 하나는 다음과 같이 할 것 같다 :
[<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)
을하지만, 사용자 정의 비교를 구현하기 위해, 하나는
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.Equals(y)...
을 쓸 수 위의 선언 아래에 추가 할 수있다, 그러나 override x.CompareTo(yobj)...
? interface System.IComparable with ...
을 지정해야하는 이유는 무엇입니까? System.IEquatable
이있는 것 같지만 지정하지 않아도됩니다. 이유가 무엇입니까? 큰 차이는 아니지만 차이점이 왜 여기에 있는지 궁금합니다.