我正在尝试制作一些数据结构来解决图形拼图问题。我试图定义一个边缘的比较标准,但我不知道如何。到目前为止:为数据类型定义自己的Ord(Haskell)
data Edge = Edge (Set String) Bool
我怎么知道让编译器知道,我想边被宣布相等如果他们有串套相同,并没有平等有什么用布尔值?
我正在尝试制作一些数据结构来解决图形拼图问题。我试图定义一个边缘的比较标准,但我不知道如何。到目前为止:为数据类型定义自己的Ord(Haskell)
data Edge = Edge (Set String) Bool
我怎么知道让编译器知道,我想边被宣布相等如果他们有串套相同,并没有平等有什么用布尔值?
虽然我不知道你为什么要忽略布尔值(我很好奇),这样做,你必须定义自己的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
。 (要找出哪些功能是必需的,哪些是可选的,您可以查看文档。)
我忽略了布尔值,因为我正在使用有向图。但是,因为对我而言重要的唯一边是在两个节点之间双向的边。我使用布尔值作为“往复”字段,所以我可以摆脱任何没有等效返回边缘的有向边。然后,我可以过滤该布尔值来创建一个无向图。 这是丑陋的,但我无法在短时间内想到其他任何事情。 – 2010-06-17 22:10:59
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
不要忘记'deriving'关键字! – 2010-06-20 07:56:35