
On Wed, Aug 20, 2014 at 10:35 AM, Michael Snoyman
On Wed, Aug 20, 2014 at 11:28 AM, Johan Tibell
wrote: On Wed, Aug 20, 2014 at 10:23 AM, Erik Hesselink
wrote: As I understood, the question was if GHC would first compare pointers, and only call the Eq instance if the pointers are not equal. I guess this would be safe, but I don't think GHC does such a thing.
I think the reason it isn't done is that it's not always an optimization. We do it manually in e.g. bytestring.
There are two cases I can think of where it would also change the semantics of the code:
1. An Eq instance that doesn't obey the reflective property (not recommended):
data BadEq = BadEq instance Eq BadEq where BadEq == BadEq = False
I think this is just a buggy instance, and if you do this, nothing is guaranteed. Many functions with an Eq constraint will also not work. Interestingly, reflexivity is not a law listed in the haddock documentation. Erik