2011-08-16 18 views

Respuesta

14

La mejor manera sería simplemente agregar deriving (Eq, Ord) a la definición del tipo.

Como ha enumerado sus constructores en orden ascendente, la instancia Ord derivada le dará exactamente el orden que desee.

Sin embargo, si cambiar el orden en la definición no es una opción por alguna razón, aún puede derivar Eq, ya que para eso el orden no importa. Dada una instancia de Eq, podemos escribir manualmente una instancia para Ord. La forma más breve de definir la comparación sería, probablemente, deletrear todas las combinaciones para las cuales compare debería devolver LT y luego simplemente usar compare x y | x == y = Eq; compare _ _ = GT para las combinaciones restantes.

+0

Gracias, yo no sabía que la orden se conserva. – LennyStackOverflow

+0

Pregunta de bonificación: ¿qué pasa si el orden en la definición no refleja el orden numérico? – LennyStackOverflow

+2

@Lenny: Entonces tendría instanciar Ord y definir 'compare' a mano (asumiendo que cambiar el orden en la definición no es una opción por alguna razón) - aún puede derivar Eq aunque para eso el orden no importa . La forma más concisa de definir 'comparar' probablemente sería deletrear todas las combinaciones para las cuales comparar debería devolver LT y luego simplemente usar 'comparar x y | x == y = Eq; compare _ _ = GT' para las combinaciones restantes. – sepp2k

3

Como se ha mencionado, puede derivar Eq y Ord. O bien, podría derivar Enum y luego hacer

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

o simplemente explicarla toda

instance Eq Rating where 
    OneStar == OneStar = True 
    TwoStar == TwoStar = True 
... 
    _ == _ = False 
Cuestiones relacionadas