[Haskell-cafe] Justification for Ord inheriting from Eq?

Robert Dockins robdockins at fastmail.fm
Fri Apr 7 12:49:38 EDT 2006


On Apr 7, 2006, at 9:43 AM, Jacques Carette wrote:
> Robert Dockins wrote:
>>> The behaviour of NaN actually makes perfect sense when you  
>>> realise that
>>> it is Not a Number.  Things that are not numbers are incomparable  
>>> with
>>> things that are.
>>>
>>> Yes, NaN can be of type Float.  But it's not a Float.
>>
>> If you take that tack, then you have to concede that the type  
>> system isn't doing what it should (keeping me from having  
>> something not-a-float where I expect a float).  Any way you slice  
>> it, its an unfortunate situation.
>>
>> I'd personally rather that any operation generating NaN raises an  
>> exception, a la divide by 0 at Int.  I think (although I'm not  
>> sure) that the floating point infinities play nice wrt equality  
>> and ordering, so getting rid of NaN would restore at least _some_  
>> semblance of proper algebraic behavior to the floating point  
>> representations.  (And the FFI already has CFloat/CDouble, so you  
>> should use those when you really need to actually do something  
>> with NaN generated by external code, and CFloat/CDobule should not  
>> be members of Eq and Ord).
>>
>> Or at the very least, attempting to compare NaN using (==) or (<)  
>> and friends should raise an exception, rather than just returning  
>> broken results.
>>
>> Rob Dockins
>
> The IEEE 754 standard explicitly specifies that complete  
> implementations can have either or both 'signalling' NaNs and  
> 'quiet' NaNs.  It appears that current Haskell implementations have  
> chosen to go with quiet NaNs, which is very surprising indeed, as  
> that does go "against" the type system.  Signalling NaNs are more  
> consistent with the rest of Haskell's semantics.
>
> However, it is also important to note that IEEE 754 also mandates  
> 'trap handlers' for signalling NaNs, so that implementors may  
> choose (even at run-time, on a per-instance basis) what to do with  
> any given occurence of NaN.  In particular, it is possible to  
> resume the computation with a _value_ being substituted in for that  
> NaN.  These 'trap handlers' are also in there for division-by-zero,  
> so that one may _choose_ to return either infinity or raise an  
> actual exception.
>
> If one reads the standard (IEEE 754) carefully enough, it is  
> possible to 'pick' an implementation of it which actually fits in  
> with Haskell fairly well.  Yes, the standard is explicitly written  
> to have *choices* in it for implementors.  The current  
> implementation is generally standard-compliant, but does not seem  
> to 'pick' a path of least-resistance wrt the rest of Haskell.

Is this an H' worthy item?


Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
           -- TMBG





More information about the Haskell-Cafe mailing list