我正在尝试为无方向边创建数据类型的实例.边缘1 2 ==边缘2 1(即边缘从1到2与边缘从2到1相同,方向无关紧要).
以下是数据类型,Eq实例和Ord实例尝试的示例:
data Edge = Edge Int Int deriving Show
instance Eq Edge where
(Edge x1 y1) == (Edge x2 y2) = ((x1 == x2 && y1 == y2) || (x1 == y2 && y1 == x2))
instance Ord Edge where
compare e1@(Edge x1 y1) e2@(Edge x2 y2) = if e1 == e2
then EQ
else ????
Run Code Online (Sandbox Code Playgroud)
知道在这种情况下如何获得完全有序的 Ord实例吗?
我的答案类似于Thomas的,除了我建议你在构造边缘时进行标准化.
mkEdge :: Int -> Int -> Edge
mkEdge x y | x <= y = Edge x y
| otherwise = Edge y x
Run Code Online (Sandbox Code Playgroud)
现在您知道具有较小索引的顶点首先出现,并且deriving (Eq, Ord)实例将完全按照您的意愿执行.您只需要确保只使用mkEdge"智能构造函数" 创建边(您可以通过放入Edge模块而不是导出Edge构造函数来完成此操作).