2013-04-23 36 views
2

我有一個圖的聲明,我需要在Haskell中重載「==」運算符(本書的問題)。Haskell:過載==圖ADT

data Node a = Node { 
label :: a, 
adjacent :: [(a,Int)] 
} deriving Show 

data Network a = Graph [Node a] deriving Show 

基本上,兩個圖是相同的,當它們具有相同的頂點和邊(但節點的可以是在網絡的數據類型不同的順序,以及在節點數據類型相鄰頂點的列表)。在這方面有一些困難,任何幫助將不勝感激。

在此先感謝。

注:我的問題是與平等檢查,而不是使類型類的實例的語法。

+1

標題是不同於你實際想要的 – Arjan 2013-04-23 15:59:23

+0

如果標題混亂,那麼讓我改變它 – 2013-04-23 16:01:57

回答

5

這是你在找什麼?

import Data.Function (on) 
import qualified Data.Map as M 

instance Ord a => Eq (Network a) where 
    (==) = (==) `on` f where 
     f :: Ord a => Network a -> M.Map a (M.Map a Int) 
     f (Graph nodes) = M.fromList $ map g nodes 
     g :: Ord a => Node a -> (a, M.Map a Int) 
     g node = (label node, M.fromList $ adjacent node) 

什麼這個實現的功能:

  • 每個網絡的地圖轉換
  • 測試對於平等這些地圖

,因爲地圖無序(與原有名單不包含重複)原始列表的順序不會影響輸出。

您甚至可以更改您的NodeNetwork表示法以使用Map s。

+1

你能解釋一下你做了什麼嗎? – 2013-04-23 16:07:53

+0

嗯,謝謝,非常全面的回答 – 2013-04-23 16:17:31

+0

你有鏈接到算法嗎?我的意思是僞代碼或以這種方式的東西? – 2013-04-23 16:21:01

6

如果你不能只使用deriving (Eq, Show)那麼你必須執行它手工。

instance (Eq a) => Eq (Node a) where 
    n1 == n2 = (* Implement the equality check here *) 

instance (Eq a) => Eq (Network a) where 
    g1 == g2 = (* Implement the equality check here *) 

這實際上是派生語句自動爲您做的。

如果你想了解更多關於類型類的內容,我很想學習你一個Haskell的解釋。

如果您需要實際的平等檢查幫助,請使用Data.MapfromList函數。

至於節點,該段應該這樣做

(==) = (==) `on` label 

或者更明確的

n1 == n2 = label n1 == label n2 
+0

我知道我必須做實例,問題帶有完全相等檢查 – 2013-04-23 15:48:48

+0

一些遞歸算法,我不知道 – 2013-04-23 15:49:06

+0

節點可以有不同的相鄰節點嗎?例如,2個節點可以有相同的標籤? – jozefg 2013-04-23 15:50:26