infixr 8 ^, ^^
infixl 7 /, `quot`, `rem`, `div`, `mod`
+infixl 7 %
default () -- Double isn't available yet,
-- and we shouldn't be using defaults anyway
\begin{code}
data (Integral a) => Ratio a = !a :% !a deriving (Eq)
+
+-- | Arbitrary-precision rational numbers, represented as a ratio of
+-- two 'Integer' values. A rational number may be constructed using
+-- the '%' operator.
type Rational = Ratio Integer
+
+ratioPrec, ratioPrec1 :: Int
+ratioPrec = 7 -- Precedence of ':%' constructor
+ratioPrec1 = ratioPrec + 1
+
+infinity, notANumber :: Rational
+infinity = 1 :% 0
+notANumber = 0 :% 0
+
+-- Use :%, not % for Inf/NaN; the latter would
+-- immediately lead to a runtime error, because it normalises.
\end{code}
instance Integral Int where
toInteger i = int2Integer i -- give back a full-blown Integer
- -- Following chks for zero divisor are non-standard (WDP)
- a `quot` b = if b /= 0
- then a `quotInt` b
- else error "Prelude.Integral.quot{Int}: divide by 0"
- a `rem` b = if b /= 0
- then a `remInt` b
- else error "Prelude.Integral.rem{Int}: divide by 0"
+ a `quot` 0 = divZeroError
+ a `quot` b = a `quotInt` b
+
+ a `rem` 0 = divZeroError
+ a `rem` b = a `remInt` b
+
+ a `div` 0 = divZeroError
+ a `div` b = a `divInt` b
- x `div` y = x `divInt` y
- x `mod` y = x `modInt` y
+ a `mod` 0 = divZeroError
+ a `mod` b = a `modInt` b
+ a `quotRem` 0 = divZeroError
a `quotRem` b = a `quotRemInt` b
+
+ a `divMod` 0 = divZeroError
a `divMod` b = a `divModInt` b
\end{code}
instance Integral Integer where
toInteger n = n
+ a `quot` 0 = divZeroError
n `quot` d = n `quotInteger` d
- n `rem` d = n `remInteger` d
- n `div` d = q where (q,_) = divMod n d
- n `mod` d = r where (_,r) = divMod n d
+ a `rem` 0 = divZeroError
+ n `rem` d = n `remInteger` d
+ a `divMod` 0 = divZeroError
a `divMod` b = a `divModInteger` b
+
+ a `quotRem` 0 = divZeroError
a `quotRem` b = a `quotRemInteger` b
+
+ -- use the defaults for div & mod
\end{code}
instance (Integral a) => Show (Ratio a) where
{-# SPECIALIZE instance Show Rational #-}
- showsPrec p (x:%y) = showParen (p > ratio_prec)
- (shows x . showString " % " . shows y)
-
-ratio_prec :: Int
-ratio_prec = 7
+ showsPrec p (x:%y) = showParen (p > ratioPrec) $
+ showsPrec ratioPrec1 x .
+ showString " % " .
+ showsPrec ratioPrec1 y
instance (Integral a) => Enum (Ratio a) where
{-# SPECIALIZE instance Enum Rational #-}