[英]Haskell: overloading == for graph ADT
我有一個圖形聲明,我需要在Haskell中重載“==”運算符(本書中的問題)。
data Node a = Node {
label :: a,
adjacent :: [(a,Int)]
} deriving Show
data Network a = Graph [Node a] deriving Show
基本上,如果它們具有相同的頂點和邊緣,則兩個圖是相等的(但是網絡數據類型中的節點可以是不同的順序以及節點數據類型中的相鄰頂點的列表)。 有一些困難,任何幫助將不勝感激。
提前致謝。
注意:我的問題是使用等式檢查,而不是使用類型類實例的語法。
如果您不能只使用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.Map
與fromList
函數一起使用。
至於節點,這個代碼片段應該這樣做
(==) = (==) `on` label
或者更明確
n1 == n2 = label n1 == label n2
這是你在找什么?
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)
這個實現的作用:
由於地圖是無序的(並且原始列表不包含重復項),原始列表的順序不會影響輸出。
您甚至可以更好地更改Node
和Network
表示以使用Map
。
您必須為網絡實現Eq實例:
instance Eq (Network a) where
n1 == n2 = ...
更多信息:
http://learnyouahaskell.com/types-and-typeclasses#typeclasses-101
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.