[trac@galois.com: Re: [GHC] #1218: Add sortNub and sortNubBy to
Data.List]
Bertram Felgenhauer
bertram.felgenhauer at googlemail.com
Wed Mar 21 06:48:13 EDT 2007
Duncan Coutts wrote:
> So can anyone break this hypothesis?
>
> nub . sort = map head . group . sort
Just make Eq and Ord instances that are completely unrelated, say
data Foo = Foo Int Int deriving Show
instance Eq Foo where
Foo a _ == Foo b _ = a == b
instance Ord Foo where
Foo _ a `compare` Foo _ b = a `compare` b
example = [Foo 0 1, Foo 0 2, Foo 1 1]
With these instances
nub . sort
does something well-defined; sort only uses `compare` and nub only uses
(==). Note that Data.List.sort actually provides a stable sort. I don't
know if that's specified anywhere, but it's true for both Data.List and
for the Haskell report implementation of sort.
The rule
> nub . sort = map head . group . sort
on the other hand relies on a correspondence between Eq and Ord and
breaks:
> nub . sort $ example
[Foo 0 1,Foo 1 1]
> map head . group . sort $ example
[Foo 0 1,Foo 1 1,Foo 0 2]
More precisely the rule works iff a <= b && b <= c && a == c
implies a == b.
I'm not sure whether mismatching Eq and Ord [*] instances should be a
programmer error, but if so this needs to be stated somewhere. Right
now, Data.List has no such restriction.
Bertram
[*] Ideally, the correspondance should be that
(a == b) == (a <= b && b <= a)
More information about the Libraries
mailing list