2011-08-16 19 views

risposta

14

Il modo migliore sarebbe semplicemente aggiungere deriving (Eq, Ord) alla definizione del tipo.

Poiché hai elencato i costruttori in ordine crescente, l'istanza derivata Ord ti darà esattamente l'ordine che desideri.

Tuttavia, se la modifica dell'ordine nella definizione non è un'opzione per qualche motivo, è comunque possibile ricavare Eq, poiché per questo l'ordine non ha importanza. Data un'istanza di Eq, possiamo scrivere manualmente un'istanza per Ord. Il modo più sintetico per definire il confronto sarebbe probabilmente quello di spiegare tutte le combinazioni per cui confrontare dovrebbe restituire LT e quindi usare semplicemente confrontare x y | x == y = Eq; confronta _ _ = GT per le restanti combinazioni.

+0

Grazie, non sapevo che l'ordine è conservato. – LennyStackOverflow

+0

Domanda bonus: cosa succede se l'ordine nella definizione non riflette l'ordine numerico? – LennyStackOverflow

+2

@Lenny: Allora avrai istanziato Ord e definisci 'compare' a mano (supponendo che cambiare l'ordine nella definizione non sia un'opzione per qualche motivo) - puoi comunque derivare Eq anche se per questo l'ordine non ha importanza . Il modo più succinto per definire 'compare' sarebbe probabilmente quello di spiegare tutte le combinazioni per cui confrontare dovrebbe restituire LT e quindi usare semplicemente' compare x y | x == y = Eq; confronta _ _ = GT' per le restanti combinazioni. – sepp2k

3

Come è stato menzionato, è possibile derivare Eq e Ord. Oppure si potrebbe ricavare Enum e poi fare

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

O semplicemente incantesimo tutto fuori

instance Eq Rating where 
    OneStar == OneStar = True 
    TwoStar == TwoStar = True 
... 
    _ == _ = False 
Problemi correlati