
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.