2013-02-27 3 views
0

동등 연산자와 비교 연산자를 오버라이드하여 bool 이외의 다른 유형을 생성하는 특별한 이유가 있습니다.부울 반환 유형이 아닌 동등 연산자 및 비교 연산자에 오버로드하기

나는 아래의 해결 방법을 가지고 있지만 왜 언어가 더 쉽게 할 수 없습니까?

내가 여기서 다루는 것은 이러한 연산자가 이미 오버로드되어있는 외부 라이브러리이므로 F #에서 동일한 방식으로 작업하기를 원할뿐입니다. 그것을 성취하기 위해서 내가해야만하는 것은 옳지 않은 것 같습니다.

type ATArrayLT = ATArrayLT with 
    static member  (?<-) (x:ATArray, ATArrayLT, y:int ) = ATArray.op_LessThan(x, float32 y) 
    static member  (?<-) (y:int , ATArrayLT, x:ATArray) = ATArray.op_LessThan(x, float32 y)   
    static member  (?<-) (x:ATArray, ATArrayLT, y:float32) = ATArray.op_LessThan(x, y) 
    static member  (?<-) (y:float32, ATArrayLT, x:ATArray) = ATArray.op_LessThan(x, y) 
    static member  (?<-) (x:ATArray, ATArrayLT, y:ATArray) = ATArray.op_LessThan(x, y) 
    static member inline (?<-) (x  , ATArrayLT, y  ) = x < y 

let inline (<) x y = x ? (ATArrayLT) <- y 

답변

0

비교와 평등 사업자 (<, >, =)는 잘 정의 된 행동 (spec §8.15.6)가 있습니다. 특히 비교는 IComparable 구현에 따라 다르며 동등 함은 Equals에 달려 있습니다.

C#에서 같은 이름의 연산자와 유사점이 있습니다. 당신은 여전히 ​​비 전통적인 행동을 완료는 C#의 변형을 제공 할 수 있습니다, 다른 .NET 언어

type T() = 
    static member op_LessThan (a: T, b: T) = new obj() 

에서 사용하지만 그들은 F #의 평등과 비교 연산자에 아무런 영향을 미치지합니다.

+0

비교 및 ​​동등성은 구조체 평등, 해시 및 비교를 허용하는 구성 필드 유형을 갖는 F # 전용 튜플 및 "목록, 옵션, 배열 및 사용자 정의 레코드, 유니온 및 구조체 유형의 모든 유형에 대해 구조적 구조는 아닙니다 ". 따라서 사용자 정의 클래스의 경우 해당 연산자에 과부하가 걸릴 수 있습니다. –

+0

사실입니다. 내 요점은 평등/비교가 F #에서 다르게 정의되고 잘 작동한다는 것입니다. 그것들은 C#에있는 것처럼 임시적인 의미를 지닌 통사론적인 설탕이 아닙니다. 그들은 F #에서 사용자 정의 할 수 있습니다. OP가 원하는 범위가 아닙니다. – Daniel

+0

위의 방법을 사용할 때 위험이 있습니까? – Dave