2010-06-17 13 views
17

Próbuję utworzyć struktury danych, aby rozwiązać zagadkę graficzną. Próbuję zdefiniować kryteria porównania krawędzi, ale nie jestem pewien jak. Do tej pory:Definiowanie własnego Ord dla typu danych (Haskell)

data Edge = Edge (Set String) Bool 

Jak mówię niech kompilator wie, że chcę krawędzie należy uznać za równe, jeśli mają one identyczne zestawy strun, i nie ma równości mają nic wspólnego z wartością logiczną?

+0

Nie zapomnij o słowach kluczowych "pochodnych"! –

Odpowiedz

34

Chociaż nie jestem pewien, dlaczego chcesz zignorować wartość logiczną (jestem ciekawy), aby to zrobić musisz zdefiniować własną Eq instancji; domyślny nie zadziała, ponieważ porównuje każde pole. Na szczęście, to jest proste:

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

Jeśli chcesz, aby móc zamówić krawędzie, a chcesz zamawianie porównać tylko zestawy też implementacja jest bardzo podobna:

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

Każdy rodzaj klasa definiuje pewien zestaw metod, które należy wdrożyć; Eq wymaga == lub /= i Ord wymaga <= lub compare. (Aby dowiedzieć się, które funkcje są wymagane, a które są opcjonalne, możesz sprawdzić dokumentację.)

+3

Ignoruję boolean, ponieważ pracuję z ukierunkowanym wykresem. Ponieważ jednak jedynymi krawędziami, które są dla mnie ważne, są te, które są dwukierunkowe między obydwoma węzłami. Używam boolean jako pola "odwzajemnionego", więc mogę pozbyć się dowolnych skierowanych krawędzi, które nie mają równoważnej krawędzi powrotnej. Mogę następnie przefiltrować tę wartość logiczną, aby utworzyć nieukierunkowany wykres. To brzydkie, ale nie mogę myśleć o niczym innym w krótkim czasie. –

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 
Powiązane problemy