2010-06-17 16 views
17

Bir grafik bulmacasını çözmek için bazı veri yapıları oluşturmaya çalışıyorum. Bir kenarın karşılaştırma kriterlerini tanımlamaya çalışıyorum ama nasıl emin değilim. Şimdiye kadar:Veri türü için kendi Ord tanımlamak (Haskell)

data Edge = Edge (Set String) Bool 

nasıl derleyici izin diyeyim ben kenarları onlar dizeleri aynı setleri varsa eşit beyan ve eşitlik yok olmak istiyorum boolean değeri ile ilgisi olduğunu biliyorum? Ben kendi Eq örneği tanımlamak gerekecek bunun için, (merak ediyorum) boolean değerini göz ardı etmek istiyorum neden emin değilim rağmen

+0

"türetme" anahtar kelimesini unutmayın! –

cevap

34

; varsayılan alan, her alanı karşılaştırdığı için çalışmaz. Neyse ki, bu kolaydır:

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

Eğer kenarları sipariş edebilmek istiyorum ve sipariş çok sadece setleri karşılaştırmak istiyorsanız, sizin uygulaması çok benzer:

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

Her tür Sınıf, uygulanması gereken belirli bir takım yöntemleri tanımlar; Eq, == veya /='u gerektirir ve Ord, <= veya compare'u gerektirir. (Hangi işlevlerin gerekli olduğunu ve isteğe bağlı olduğunu öğrenmek için, belgelere göz atabilirsiniz.)

+3

Booleanı görmezden geliyorum çünkü yönlendirilmiş bir grafikle çalışıyorum. Ancak, benim için önemli olan tek kenarlar, her iki düğüm arasında çift yönlü olanlardır. Ben booleanı "karşılıklı" bir alan olarak kullanıyorum, böylece eşdeğer bir geri dönüş kenarına sahip olmayan yönlendirilmiş kenarlardan kurtulabilirim. Ben daha sonra, doğrulanmamış bir grafik oluşturmak için bu boole üzerine filtre uygulayabilirim. Çirkin ama kısa sürede başka bir şey düşünemiyorum. –

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