On Wed, Oct 2, 2013 at 4:17 PM, Tom Ellis <tom-lists-haskell-cafe-2013@jaguarpaw.co.uk> wrote:
What's the benefit of this requirement, as opposed to, for example

   False <= _ = True

I was trying to cover for void types, where the only sensible definitions are

    instance Eq Void where
        _ == _ = error "void (==)"

    instance Ord Void where
        _ <= _ = error "void (<=)"

This is because reflexivity must be guaranteed, so undefined == undefined may not yield False, but I doubt error "foo" == (let x = x in x) should yield True either. But perhaps this exception deserves its own rule.

On Wed, Oct 2, 2013 at 5:36 PM, Roman Cheplyaka <roma@ro-che.info> wrote:
* Stijn van Drongelen <rhymoid@gmail.com> [2013-10-02 15:46:42+0200]
> I do think something has to be done to have an Eq and Ord with more strict
> laws.
>
> * Operators in Eq and Ord diverge iff any of their parameters are bottom.

This outlaws the Eq instances of lists, trees, and other (co)recursive
types.

Furthermore, in this formulation, even Eq for tuples is illegal, because

  (undefined, something) == somethingElse

is going to diverge.

Roman

I knew this was going to bite me in the ass. Let me try again:

* Operators in Eq and Ord may only diverge when any of their parameters are bottom.