如果我有自定义Eq,我需要自定义Ord实例吗?

ako*_*nsu 4 haskell typeclass

我有一个数据类型,用于派生泛型EqOrd:

data State = State (Set String) (Set String) deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)

然后我创建了自己的实例Eq:

data State = State (Set String) (Set String) deriving Ord

instance Eq State where
    (State s0 s1) == (State s0' s1') =
        Set.union s0 s1 == Set.union s0' s1'
Run Code Online (Sandbox Code Playgroud)

我不确定这Ord是否会破坏行为以及是否需要创建一个实例Ord.有人可以澄清一下吗?

Car*_*ten 9

正如我在评论中所说,你违反了Ord法律:

a :: State
a = State (Set.fromList ["A"]) (Set.fromList ["B"])

b :: State
b = State (Set.fromList ["B"]) (Set.fromList ["A"])     
Run Code Online (Sandbox Code Playgroud)

如现在a == ba < b:

?> a == b
True
?> a < b
True
?> b < a
False
Run Code Online (Sandbox Code Playgroud)

看:Ord应该是一个总命令,一个法则就是那些

a <b当且仅当a≤b且a≠b时

所以当然你应该用你自己实例的明显选择来修复它:

instance Ord State where
  (State s0 s1) <= (State s0' s1') =
    Set.union s0 s1 <= Set.union s0' s1'

?> a == b
True
?> b < a
False
?> a < b
False
Run Code Online (Sandbox Code Playgroud)