Haskell 为数据类型定义自己的Ord
我试图制作一些数据结构来解决一个图形难题。我试图定义边缘的比较标准,但我不确定如何定义。到目前为止:Haskell 为数据类型定义自己的Ord,haskell,data-structures,Haskell,Data Structures,我试图制作一些数据结构来解决一个图形难题。我试图定义边缘的比较标准,但我不确定如何定义。到目前为止: data Edge = Edge (Set String) Bool 如果边具有相同的字符串集,并且与布尔值无关,我如何“通知”编译器我希望边声明为相等?尽管我不确定为什么要忽略布尔值(我很好奇),但要做到这一点,您必须定义自己的Eq实例;默认值不起作用,因为它会比较每个字段。幸运的是,这很容易: import Data.Set data Edge = Edge (Set String) B
data Edge = Edge (Set String) Bool
如果边具有相同的字符串集,并且与布尔值无关,我如何“通知”编译器我希望边声明为相等?尽管我不确定为什么要忽略布尔值(我很好奇),但要做到这一点,您必须定义自己的
Eq
实例;默认值不起作用,因为它会比较每个字段。幸运的是,这很容易:
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
instance Eq Edge where
(Edge s1 _) == (Edge s2 _) = s1 == s2
如果您希望能够对边进行排序,并且希望排序也只比较集合,那么您的实现非常类似:
instance Ord Edge where
(Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2
每个类型类定义了一组需要实现的方法
Eq
需要=
或/=
,而Ord
需要我正在忽略布尔值,因为我正在处理有向图。但是,因为对我来说唯一重要的边是两个节点之间的双向边。我使用布尔值作为“往复”字段,因此我可以去掉任何没有等效返回边的有向边。然后我可以过滤这个布尔值来创建一个无向图。这很难看,但我在短时间内想不出其他任何东西。别忘了派生关键字!