
Duncan Coutts wrote:
Michael D. Adams wrote:
Is there a good reason why Rational is defined in a way that it can not represent Nan, Inf and -Inf? (Any other exceptional values I forgot?) Would fixing the definition so that it can represent those values be sufficient to fix this entire problem?
It may well help conversions of floating point numbers through Rational but the contrary argument is that Rational is a well defined concept and that values like those do not belong in it.
The problem seems to be that the various real/float classes in the Prelude cannot provide a class that allows conversions directly between Double and Float without going via a universal type because the class would either have to be multi-parameter or mention one of the types in the class definition. For integral types it's no problem to go via Integer but floating point types are a good deal more tricky.
Exactly. Floating numbers also have other issues because of these values, e.g. they aren't Ord[1] and may not be Eq[2]. If we added the exceptional values to Rational we'd re-introduce all the problems they cause. As Duncan says, Rational is a well-defined concept by itself--- it's just a different concept than floating numbers. For what it's worth, GHC.Real does provide literals for 1%0 and 0%0. However, since these values cannot be constructed by the smart constructor (%), functions on Ratios assume they cannot exist and therefore treat them incorrectly or raise errors. [1] For those who think this is trivial, consider what value the `compare` function should return when one of the arguments is NaN. We don't even have a consistent lie for this! In Hugs it always returns EQ, whereas in GHC it always returns GT. Thus, not only is NaN not handled properly, but programs will behave differently depending on the compiler. [2] Since NaN are defined to be unequal to everything including themselves. This isn't damning per se, but it does go against the law of the excluded middle, which people typically assume of Eq. Whether Eq must obey this law or not is unspecified. (Not to mention the fuzziness issues.) -- Live well, ~wren