2011-08-16 4 views

답변

14

가장 좋은 방법은 형식 정의에 deriving (Eq, Ord)을 추가하는 것입니다.

생성자를 오름차순으로 나열 했으므로 구체화 된 Ord 인스턴스는 원하는 순서를 정확하게 제공합니다.

그러나 정의에서 순서를 변경하는 것이 어떤 이유로 든 옵션이 아닌 경우에도 순서는 중요하지 않으므로 Eq를 파생시킬 수 있습니다. Eq의 인스턴스가 주어지면 Ord의 인스턴스를 수동으로 작성할 수 있습니다. compare를 정의하는 가장 간결한 방법은 아마도 compare가 LT를 리턴해야하는 모든 조합을 철자하는 것이고, 단순히 compare x를 사용하는 것입니다. y | x == y = Eq; 나머지 조합은 _ _ = GT를 비교하십시오.

+0

감사를 모두 밖으로 철자 수 있습니다. – LennyStackOverflow

+0

보너스 질문 : 정의의 순서가 숫자 순서를 반영하지 않으면 어떻게됩니까? – LennyStackOverflow

+2

@Lenny : 그러면 Ord를 인스턴스화하고 손으로 'compare'를 정의했을 것입니다. (정의에서 순서를 변경하는 것이 어떤 이유로 옵션이 아니라고 가정 할 때) - 순서가 중요하지 않기 때문에 여전히 Eq를 파생시킬 수 있습니다 . 'compare'를 정의하는 가장 간결한 방법은 compare가 LT를 리턴해야하는 모든 조합을 철자하는 것입니다. 그리고 간단히'compare x y | x == y = Eq; 나머지 조합은 _ _ = GT'와 비교하십시오. – sepp2k

3

앞서 언급 한 것처럼 EqOrd을 얻을 수 있습니다. 또는 당신은 내가 순서가 보존되는 것을 몰랐 Enum을 유도하고

instance Eq Rating where 
    x == y = fromEnum x == fromEnum y 

을하거나

instance Eq Rating where 
    OneStar == OneStar = True 
    TwoStar == TwoStar = True 
... 
    _ == _ = False 
관련 문제