2010-06-17 307 views
17

我正在嘗試製作一些數據結構來解決圖形拼圖問題。我試圖定義一個邊緣的比較標準,但我不知道如何。到目前爲止:爲數據類型定義自己的Ord(Haskell)

data Edge = Edge (Set String) Bool 

我怎麼知道讓編譯器知道,我想邊被宣佈相等如果他們有串套相同,並沒有平等有什麼用布爾值?

+0

不要忘記'deriving'關鍵字! – 2010-06-20 07:56:35

回答

34

雖然我不知道你爲什麼要忽略布爾值(我很好奇),這樣做,你必須定義自己的Eq實例;默認的一個將不起作用,因爲它比較每個字段。幸運的是,這很容易:

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

如果你希望能夠訂購的邊緣,並且要排序只是套過比較,您的實現是非常相似:

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

每種類型類定義了一組需要實現的方法; Eq要求==/=Ord要求<=compare。 (要找出哪些功能是必需的,哪些是可選的,您可以查看文檔。)

+3

我忽略了布爾值,因爲我正在使用有向圖。但是,因爲對我而言重要的唯一邊是在兩個節點之間雙向的邊。我使用布爾值作爲「往復」字段,所以我可以擺脫任何沒有等效返回邊緣的有向邊。然後,我可以過濾該布爾值來創建一個無向圖。 這是醜陋的,但我無法在短時間內想到其他任何事情。 – 2010-06-17 22:10:59

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