2011-04-30 1 views
5

Je suis relativement nouveau pour Haskell. J'écris un clone du jeu de cartes uno et je veux une sortie assez colorée d'une carte. Je neHaskell dérivant des instances supplémentaires pour les types de données importés

import System.Console.ANSI 

qui fournit

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

maintenant je veux ajouter dériver (Ord, Eq) ainsi, je pourrais écrire ceci dans le fichier source du package importé, mais il devrait y avoir un moyen plus simple de le faire. Je n'ai aucune idée de ce que les mots-clés à google pour ou chercher dans un livre.

Répondre

4

Plus besoin d'éditer la bibliothèque. Dans votre fichier source, état:

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

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

Explication: fromEnum est une fonction sur Enum qui retourne un int (Black -> 0, Red -> 1, etc.). Les nombres entiers sont évidemment égaux, comparables et ordonnés.

Modifier: @ version de raiponce, dans les commentaires, est évidemment plus jolie:

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

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

Pour la lecture classe de types I ajouté les lignes suivantes 'exemple Lire Couleur where¬ readsPrec _ str = [ (couleur (c), t) | ¬ (c, t) ← lit str] ¬ où la couleur x = cas x de "Noir" → Noir¬ "Rouge" → Rouge¬ "Vert" → Vert¬ "Jaune" → Jaune¬ "Bleu" → Bleu¬ ... ' – epsilonhalbe

+1

En utilisant' import Data.Function (on) ':' instance Eq Color où (==) = (==) \ 'sur \' fromEnum', 'instance Ord Color où compare = compare \ 'sur \' fromEnum'. – rampion

+6

Est-ce qu'il ne peut pas utiliser la dérivation autonome dériver Autom et Eq automagiquement? http://www.haskell.org/haskellwiki/GHC/Stand-alone_deriving_declarations –

Questions connexes