2010-06-17 10 views
17

Je tente de créer des structures de données pour résoudre un puzzle graphique. J'essaie de définir les critères de comparaison d'un bord, mais je ne sais pas comment. Jusqu'à présent:Définition de votre Ord pour un type de données (Haskell)

data Edge = Edge (Set String) Bool 

Comment puis-je dire laisser le compilateur sais que je veux bords soient déclarés égaux s'ils ont des ensembles identiques de chaînes, et ne pas avoir l'égalité ont rien à voir avec la valeur booléenne?

+0

N'oubliez pas le mot clé 'deriving'! –

Répondre

34

Bien que je ne sais pas pourquoi vous voulez ignorer la valeur booléenne (je suis curieux), faire vous devez donc définir votre propre Eq par exemple; celui par défaut ne fonctionnera pas, car il compare tous les champs. Heureusement, cela est facile:

instance Eq Edge where 
    (Edge s1 _) == (Edge s2 _) = s1 == s2 

Si vous voulez être en mesure de commander les bords, et vous voulez que la commande de comparer seulement les jeux aussi, votre implémentation est très similaire:

instance Ord Edge where 
    (Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2 

Chaque type classe définit un certain ensemble de méthodes qui doivent être mises en œuvre; Eq requiert == ou /=, et Ord requiert <= ou compare. (Pour connaître les fonctions obligatoires et facultatives, vous pouvez consulter les documents.)

+3

J'ignore le booléen parce que je travaille avec un graphe orienté. Cependant, parce que les seuls bords importants pour moi sont ceux qui sont bidirectionnels entre les deux nœuds. J'utilise le booléen comme champ "réciproque", donc je peux me débarrasser de tous les bords dirigés qui n'ont pas de bord de retour équivalent. Je peux ensuite filtrer sur ce booléen pour créer un graphique non orienté. C'est moche mais je ne vois rien d'autre à court terme. –

9
import Data.Set 

data Edge = Edge (Set String) Bool deriving Show 

instance Eq Edge where 
    (Edge a _) == (Edge b _) = a == b 

instance Ord Edge where 
    compare (Edge a _) (Edge b _) = compare a b