2010-06-17 116 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