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.
Grazie, non sapevo che l'ordine è conservato. – LennyStackOverflow
Domanda bonus: cosa succede se l'ordine nella definizione non riflette l'ordine numerico? – LennyStackOverflow
@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