Não consegui encontrar documentação para esse comportamento e parece ser um bug ([Editar] de fato é: gitlab.haskell.org/ghc/ghc/-/issues/10387 ). Estou esquecendo de algo?
Em GHCi:
> import GHC.Real
> inf = 1/O :: Double
> inf
Infinity
> infinity
1 % 0
> fromRational infinity
Infinity
> toRational inf
179769313486231590... % 1
> toRational inf == infinity
False
[Editar:]
Existe uma solução alternativa. Usando o pacote ieee754 , é possível definir o seguinte:
import GHC.Real
import qualified Numeric.IEEE as IEEE
toRational' :: (IEEE.IEEE a, Real a) => a -> Rational
toRational' a
| a == IEEE.infinity = infinity
| a == -IEEE.infinity = -infinity
| otherwise = toRational a