2017-04-11 1 views
1

관련 문자열과 위치가있는 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이있는 것 같지만 지정하지 않아도됩니다. 이유가 무엇입니까? 큰 차이는 아니지만 차이점이 왜 여기에 있는지 궁금합니다.

답변

2

차이점은 Equals의 경우 기본 클래스의 가상 메소드 인 Object.Equals를 오버라이드하는 반면 CompareTo는 인터페이스를 구현하는 반면 (F #에서는 "interface .."를 통해 명시 적으로 구현해야 함) "

관련 문제