2010-06-17 16 views
17

Ich versuche einige Datenstrukturen zu erstellen, um ein Graph Puzzle zu lösen. Ich versuche, die Vergleichskriterien eines Randes zu definieren, aber ich bin mir nicht sicher, wie. Bisher:Definieren eines eigenen Ord für einen Datentyp (Haskell)

data Edge = Edge (Set String) Bool 

Wie sage ich den Compiler mitteilen, dass ich Kanten will gleich erklärt werden, wenn sie identische Sätze von Saiten und Gleichheit habe nichts mit dem Booleschen Wert zu tun?

+0

Vergessen Sie nicht das Schlüsselwort 'deriving'! –

Antwort

34

Obwohl ich bin nicht sicher, warum Sie den Booleschen Wert ignoriert werden sollen (ich bin gespannt), dies zu tun, werden Sie Ihre eigene Eq Instanz definieren müssen; der Standard wird nicht funktionieren, da er jedes Feld vergleicht. Glücklicherweise ist dies einfach:

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

Wenn Sie in der Lage sein wollen, Kanten zu bestellen, und Sie wollen, dass die Bestellung auch nur die Sätze zu vergleichen, ist die Implementierung sehr ähnlich:

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

Jede Art class definiert eine bestimmte Menge von Methoden, die implementiert werden müssen; Eq erfordert == oder /=, und Ord erfordert <= oder compare. (Um herauszufinden, welche Funktionen benötigt werden und welche optional sind, können Sie die Dokumente überprüfen.)

+3

Ich ignoriere den booleschen Wert, weil ich mit einem gerichteten Graphen arbeite. Weil die einzigen Kanten, die mir wichtig sind, diejenigen sind, die zwischen beiden Knoten bidirektional sind. Ich verwende den Booleschen Wert als ein "reziprokes" Feld, so dass ich alle gerichteten Kanten loswerden kann, die keine äquivalente zurückkehrende Kante haben. Ich kann dann auf diesen booleschen Wert filtern, um einen ungerichteten Graphen zu erstellen. Es ist hässlich, aber ich kann nicht kurzfristig etwas anderes denken. –

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 
Verwandte Themen