2011-04-30 13 views
5

Soy relativamente nuevo en Haskell. Escribo un clon del juego de cartas uno y quiero una bonita salida en color de una carta. HagoHaskell derivando instancias adicionales para los tipos de datos importados

import System.Console.ANSI 

cuales proporciona

data Color = Black 
      | Red 
      | Green 
      | Yellow 
      | Blue 
      | Magenta 
      | Cyan 
      | White 
      deriving (Bounded, Enum, Show) 

ahora quiero añadir que deriva (Ord, Ec) así, podría escribir esto en el archivo de origen del paquete importado, pero debe haber una forma más fácil de hacer esto. No tengo ni idea de qué palabras clave buscar o buscar en un libro de google.

Respuesta

4

No es necesario editar la biblioteca. En el archivo de origen, estado:

instance Eq Color where 
    x == y = fromEnum x == fromEnum y 

instance Ord Color where 
    compare x y = compare (fromEnum x) (fromEnum y) 

Explicación: fromEnum es una función de Enum que devuelve un int (Black -> 0, Red -> 1, etc.). Los enteros son obviamente equivalentes a la igualdad y ordenados.

Editar: @ versión de rampion, en los comentarios, es obviamente más bonita:

instance Eq Color where 
    (==) = (==) `on` fromEnum 

instance Ord Color where 
    compare = compare `on` fromEnum 
+0

Para la clase de tipos leer he añadido las siguientes líneas instancia de 'Leer color where¬ readsPrec _ str = [ (color (c), t) | ¬ (c, t) ← lee str] ¬ donde color x = caso x de "Negro" → Negro¬ "Rojo" → Rojo¬ "Verde" → Verde¬ "Amarillo" → Amarillo 0 "Azul" → Azul¬ ... ' – epsilonhalbe

+1

Usando' import Data.Function (on) ':' instancia Eq Color donde (==) = (==) \ 'on \' fromEnum', 'instancia Ord Color donde compare = compare \ 'on \' fromEnum'. – rampion

+6

¿No puede él usar derivación independiente derivar Ord y Eq automágicamente? http://www.haskell.org/haskellwiki/GHC/Stand-alone_deriving_declarations –

Cuestiones relacionadas