我有一个数据类型,用于派生泛型Eq和Ord:
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.有人可以澄清一下吗?
正如我在评论中所说,你违反了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 == b也a < 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)
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |