为数据类型定义自己的Ord

时间:2010-06-17 21:56:42

标签: haskell data-structures

我正在尝试制作一些数据结构来解决图形难题。我正在尝试定义边缘的比较标准,但我不确定如何。到目前为止:

data Edge = Edge (Set String) Bool

如果编译器具有相同的字符串集,并且没有与布尔值有任何关系,我怎么能告诉编译器我希望将边声明为相等?

2 个答案:

答案 0 :(得分:46)

虽然我不确定你为什么要忽略布尔值(我很好奇),但为此你必须定义自己的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。 (要找出哪些功能是必需的,哪些是可选的,您可以查看文档。)

答案 1 :(得分:15)

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
相关问题