Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为数据类型定义自己的Ord_Haskell_Data Structures - Fatal编程技术网

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
需要
我正在忽略布尔值,因为我正在处理有向图。但是,因为对我来说唯一重要的边是两个节点之间的双向边。我使用布尔值作为“往复”字段,因此我可以去掉任何没有等效返回边的有向边。然后我可以过滤这个布尔值来创建一个无向图。这很难看,但我在短时间内想不出其他任何东西。别忘了
派生
关键字!