完全有序的Ord实例用于无方向边缘?

Che*_*tan 3 haskell

我正在尝试为无方向边创建数据类型的实例.边缘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实例吗?

luq*_*qui 6

我的答案类似于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构造函数来完成此操作).