id,summary,reporter,owner,description,type,status,priority,milestone,component,version,resolution,keywords,cc,os,architecture,failure,difficulty,testcase,blockedby,blocking,related
4335,fromRational broken for Ratio a,daniel.is.fischer,simonmar,"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.",bug,closed,normal,7.4.1,libraries/base,6.12.3,fixed,,,Unknown/Multiple,Unknown/Multiple,Incorrect result at runtime,,,,,
