Invalid Eq/Ord instances in Data.Version
(From Adrian Hey)
In Data.Version we have:
data Version =
Version {versionBranch :: [Int]
,versionTags :: [String]
}
instance Eq Version where
v1 == v2 = versionBranch v1 == versionBranch v2
&& sort (versionTags v1) == sort (versionTags v2)
-- tags may be in any order
instance Ord Version where
v1 `compare` v2 = versionBranch v1 `compare` versionBranch v2
The "laws" for valid Eq/Ord instances were argued about recently but the H98 report seems reasonably clear that (==) is supposed to test for equality and the compare method is supposed to define a total ordering. There is also an implied but not explicitly stated law that:
(x == y = True) <-> (x `compare` y = EQ)
and also this I guess..
(x == y = False) <-> ~(x `compare` y = EQ)
This law is implied by the Eq constraint on the Ord class (which seems to serve no purpose otherwise).
See also: http://www.haskell.org/pipermail/haskell-prime/2008-March/002330.html
Trac metadata
Trac field | Value |
---|---|
Version | 6.8.3 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Multiple |
Architecture | Multiple |