[Haskell-cafe] Does GHC compare pointers when eval'ing (==)

Erik Hesselink hesselink at gmail.com
Wed Aug 20 09:15:27 UTC 2014


On Wed, Aug 20, 2014 at 10:35 AM, Michael Snoyman <michael at snoyman.com> wrote:
>
> On Wed, Aug 20, 2014 at 11:28 AM, Johan Tibell <johan.tibell at gmail.com>
> wrote:
>>
>> On Wed, Aug 20, 2014 at 10:23 AM, Erik Hesselink <hesselink at gmail.com>
>> 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


More information about the Haskell-Cafe mailing list