fromRational broken for Ratio a
The Fractional
instance for Ratio a
in GHC.Real defines
fromRational (x:%y) = fromInteger x :% fromInteger y
For fixed-width Integral types, that produces invalid results:
Prelude Data.Ratio> fromRational (1 % 2^32) :: Ratio Int
1 % 0
Prelude Data.Ratio> fromRational (3 % (2^32+9)) :: Ratio Int
3 % 9
Via toRational
, these can be ported back to Rational
.
Ratio a
is generally broken for fixed-width types:
Prelude Data.Ratio> 1 % (minBound :: Int)
(-1) % (-2147483648)
but the particular brokenness of fromRational
can be alleviated by reducing:
fromRational (x:%y) = fromInteger x % fromInteger y
{-# RULES
"fromRational/id" fromRational = id :: Rational -> Rational
#-}
I think it's better to throw a divide by zero error than to produce invalid results here.
Trac metadata
Trac field | Value |
---|---|
Version | 6.12.3 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |