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

Richard A. O'Keefe ok at cs.otago.ac.nz
Thu Aug 21 00:55:10 UTC 2014

```On 21/08/2014, at 3:48 AM, Edward Kmett wrote:

> I wanted this too when I first got into Haskell, but ultimately it comes down to not being semantically correct here.
>
> NaN /= NaN, so referential equality of anything that might ever compare inside two NaN's doesn't imply value equality.
>
> e.g. Anything with a polymorphic field can't use this.
>
> You can argue that that was a bad call, but it was the expected call under IEEE semantics.

If I recall correctly, Prolog handles this by saying that
there is 'unification' and 'arithmetic comparison'
and NaN = NaN is true but NaN =:= NaN is false.

One way to handle this in a revised prelude would be
to have
class MaybeEq a
where equalIfPossible :: a -> a -> Maybe Bool
class (MaybeEq a) => MaybeOrd a
where compareIfPossible :: a -> a -> Maybe Order
and then a bunch of IEEE-like operations, e.g.,
x =? y if x = y or x,y are not comparable
x =! y if x = y

instance Eq t => MaybeEq t
where equalIfPossible x y = Just (x == y)
instance Ord t => MaybeOrd t
where compareIfPossible x y = Just (compare x y)

and to move Double and Float to MaybeEq and MaybeOrd instead
of Eq and Ord, and support deriving (MaybeEq,MaybeOrd) in the
obvious way.

Then there could be a debate about whether to allow
instance Eq Double
where x == y = if isNaN x then isNaN y else
case equalIfPossible x y of
Just True -> True
_         -> False
or not.

```