\begin{code}
-{-# OPTIONS_GHC -XNoImplicitPrelude #-}
+{-# LANGUAGE CPP, NoImplicitPrelude, MagicHash, UnboxedTuples #-}
{-# OPTIONS_HADDOCK hide #-}
-----------------------------------------------------------------------------
-- |
signum (x:%_) = signum x :% 1
fromInteger x = fromInteger x :% 1
+{-# RULES "fromRational/id" fromRational = id :: Rational -> Rational #-}
instance (Integral a) => Fractional (Ratio a) where
{-# SPECIALIZE instance Fractional Rational #-}
(x:%y) / (x':%y') = (x*y') % (y*x')
recip (x:%y)
| x < 0 = negate y :% negate x
| otherwise = y :% x
- fromRational (x:%y) = fromInteger x :% fromInteger y
+ fromRational (x:%y) = fromInteger x % fromInteger y
instance (Integral a) => Real (Ratio a) where
{-# SPECIALIZE instance Real Rational #-}
Integer -> Integer -> Integer,
Integer -> Int -> Integer,
Int -> Int -> Int #-}
+{-# INLINABLE (^) #-} -- See Note [Inlining (^)]
(^) :: (Num a, Integral b) => a -> b -> a
x0 ^ y0 | y0 < 0 = error "Negative exponent"
| y0 == 0 = 1
-- | raise a number to an integral power
(^^) :: (Fractional a, Integral b) => a -> b -> a
+{-# INLINABLE (^^) #-} -- See Note [Inlining (^)
x ^^ n = if n >= 0 then x^n else recip (x^(negate n))
+{- Note [Inlining (^)
+ ~~~~~~~~~~~~~~~~~~~~~
+ The INLINABLE pragma allows (^) to be specialised at its call sites.
+ If it is called repeatedly at the same type, that can make a huge
+ difference, because of those constants which can be repeatedly
+ calculated.
+
+ Currently the fromInteger calls are not floated because we get
+ \d1 d2 x y -> blah
+ after the gentle round of simplification. -}
+
-------------------------------------------------------
-- Special power functions for Rational
--