2013-04-23 35 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