簡體   English   中英

Haskell:重載==圖ADT

[英]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.MapfromList函數一起使用。

至於節點,這個代碼片段應該這樣做

(==) = (==) `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)

這個實現的作用:

  • 將每個網絡轉換為地圖
  • 測試這些地圖是否相等

由於地圖是無序的(並且原始列表不包含重復項),原始列表的順序不會影響輸出。

您甚至可以更好地更改NodeNetwork表示以使用Map

您必須為網絡實現Eq實例:

instance Eq (Network a) where
    n1 == n2 = ...

更多信息:

http://learnyouahaskell.com/types-and-typeclasses#typeclasses-101

https://en.wikibooks.org/wiki/Haskell/Classes_and_types

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM