
On Tue, Dec 04, 2007 at 02:21:11AM -0000, kahl@cas.mcmaster.ca wrote:
Conal Elliott wrote:
Pure values have time minBound, while eternally unknowable values (non-occurring events) have time maxBound. Hm. Now that I put it that way, I realize that I don't want to use existing minBound and maxBound if they're finite. (My event types are temporally polymorphic.) I'm mainly interested in Float/Double times, which have infinities in practice but apparently not guaranteed by the language standard.
And even in the current implementation with infinities, maxBound would be NaN, not +Inf:
Prelude> let z = 0 :: Double Prelude> 0 / z NaN Prelude> 1 / z Infinity Prelude> (-1) / z -Infinity Prelude> (0 / z) `compare` (1 / z) GT Prelude> (0 / z) `compare` ((-1) / z) GT
This is another case where the linear ordering provided by Ord has an arbitrary flavour, since the type of IEEE doubles does not have a ``natural'' linear ordering. (And I consider this as independent of whether the IEEE standard prescribes this ordering or not.)
It's rather worse than that. Prelude> let nan = 0/0 Prelude> nan > nan False Prelude> nan < nan False Prelude> nan == nan False Double isn't even totally ordered! Stefan