는하스켈에서 대수 데이터 형식에 대해 "Ord"를 구현하는 방법은 무엇입니까?
Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
하스켈 같은 대수 데이터 유형에 대한/구현 "오드"를 실체화하는 가장 좋은 방법은 무엇입니까 같은 등급이 상상?
는하스켈에서 대수 데이터 형식에 대해 "Ord"를 구현하는 방법은 무엇입니까?
Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
하스켈 같은 대수 데이터 유형에 대한/구현 "오드"를 실체화하는 가장 좋은 방법은 무엇입니까 같은 등급이 상상?
가장 좋은 방법은 형식 정의에 deriving (Eq, Ord)
을 추가하는 것입니다.
생성자를 오름차순으로 나열 했으므로 구체화 된 Ord
인스턴스는 원하는 순서를 정확하게 제공합니다.
그러나 정의에서 순서를 변경하는 것이 어떤 이유로 든 옵션이 아닌 경우에도 순서는 중요하지 않으므로 Eq를 파생시킬 수 있습니다. Eq의 인스턴스가 주어지면 Ord의 인스턴스를 수동으로 작성할 수 있습니다. compare를 정의하는 가장 간결한 방법은 아마도 compare가 LT를 리턴해야하는 모든 조합을 철자하는 것이고, 단순히 compare x를 사용하는 것입니다. y | x == y = Eq; 나머지 조합은 _ _ = GT를 비교하십시오.
앞서 언급 한 것처럼 Eq
과 Ord
을 얻을 수 있습니다. 또는 당신은 내가 순서가 보존되는 것을 몰랐 Enum
을 유도하고
instance Eq Rating where
x == y = fromEnum x == fromEnum y
을하거나
instance Eq Rating where
OneStar == OneStar = True
TwoStar == TwoStar = True
...
_ == _ = False
감사를 모두 밖으로 철자 수 있습니다. – LennyStackOverflow
보너스 질문 : 정의의 순서가 숫자 순서를 반영하지 않으면 어떻게됩니까? – LennyStackOverflow
@Lenny : 그러면 Ord를 인스턴스화하고 손으로 'compare'를 정의했을 것입니다. (정의에서 순서를 변경하는 것이 어떤 이유로 옵션이 아니라고 가정 할 때) - 순서가 중요하지 않기 때문에 여전히 Eq를 파생시킬 수 있습니다 . 'compare'를 정의하는 가장 간결한 방법은 compare가 LT를 리턴해야하는 모든 조합을 철자하는 것입니다. 그리고 간단히'compare x y | x == y = Eq; 나머지 조합은 _ _ = GT'와 비교하십시오. – sepp2k