Singular Type Constructor

Hal Daume III hal@cmu.edu
Sun, 12 Aug 2001 19:55:43 -0400 (EDT)


On Thu, 9 Aug 2001, Ashley Yakeley wrote:

> At 2001-08-08 23:00, Hal Daume III wrote:
> If there were such a thing, it would be incoherent to say: "if a is not
> TypeName, then a is TypeName with this typeName".
>
> >there are other places where i would find such a thing
> >useful/interesting beyond this TypeName foo, but this seemed like a
> >good, simple way to explain it...
>
> Can you think of a use for it that isn't semantically incoherent?

So say you wanted to define a sort of "equality" on pairs (this isn't
made up -- I wanted to do just this, recently).  Say you have:

data MyPair a b = MyPair a b

instance (Eq a, Eq b) => Eq (MyPair a b) where
    (MyPair a b) == (MyPair a' b') = (a == a') && (b == b')

this is obvious.  but supposing you wanted a sort of relaxed equality
wherein, if you chould check for equality on the second element, you
would, otherwise you would just check the first element.  i would want
to say something like:

instance (Eq a, Not (Eq b)) => Eq (MyPair a b) where
    (MyPair a _) == (MyPair a' _) = a == a'

But from what you're telling me there's no way to have both of these
instances, correct?

 - Hal

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Hal Daume III                                                  hal@cmu.edu
"arrest this man, he talks in maths"               www.andrew.cmu.edu/~hcd
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~