From 960369613bfee11e9a910e1aec0335a9a0d59551 Mon Sep 17 00:00:00 2001 From: simonpj Date: Wed, 22 Mar 2000 13:45:54 +0000 Subject: [PATCH] [project @ 2000-03-22 13:45:54 by simonpj] Make Enum for Ratio behave like the Report says --- ghc/lib/std/PrelFloat.lhs | 16 ---------------- ghc/lib/std/PrelReal.lhs | 36 +++++++++++++++++++++++++----------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/ghc/lib/std/PrelFloat.lhs b/ghc/lib/std/PrelFloat.lhs index bb85dcc..889c520 100644 --- a/ghc/lib/std/PrelFloat.lhs +++ b/ghc/lib/std/PrelFloat.lhs @@ -441,22 +441,6 @@ instance Enum Double where enumFromTo = numericEnumFromTo enumFromThen = numericEnumFromThen enumFromThenTo = numericEnumFromThenTo - -numericEnumFrom :: (Fractional a) => a -> [a] -numericEnumFrom = iterate (+1) - -numericEnumFromThen :: (Fractional a) => a -> a -> [a] -numericEnumFromThen n m = iterate (+(m-n)) n - -numericEnumFromTo :: (Ord a, Fractional a) => a -> a -> [a] -numericEnumFromTo n m = takeWhile (<= m + 1/2) (numericEnumFrom n) - -numericEnumFromThenTo :: (Ord a, Fractional a) => a -> a -> a -> [a] -numericEnumFromThenTo e1 e2 e3 = takeWhile pred (numericEnumFromThen e1 e2) - where - mid = (e2 - e1) / 2 - pred | e2 > e1 = (<= e3 + mid) - | otherwise = (>= e3 + mid) \end{code} diff --git a/ghc/lib/std/PrelReal.lhs b/ghc/lib/std/PrelReal.lhs index 530f123..e6d64d5 100644 --- a/ghc/lib/std/PrelReal.lhs +++ b/ghc/lib/std/PrelReal.lhs @@ -126,6 +126,27 @@ class (Real a, Fractional a) => RealFrac a where \end{code} +These 'numeric' enumerations come straight from the Report + +\begin{code} +numericEnumFrom :: (Fractional a) => a -> [a] +numericEnumFrom = iterate (+1) + +numericEnumFromThen :: (Fractional a) => a -> a -> [a] +numericEnumFromThen n m = iterate (+(m-n)) n + +numericEnumFromTo :: (Ord a, Fractional a) => a -> a -> [a] +numericEnumFromTo n m = takeWhile (<= m + 1/2) (numericEnumFrom n) + +numericEnumFromThenTo :: (Ord a, Fractional a) => a -> a -> a -> [a] +numericEnumFromThenTo e1 e2 e3 = takeWhile pred (numericEnumFromThen e1 e2) + where + mid = (e2 - e1) / 2 + pred | e2 > e1 = (<= e3 + mid) + | otherwise = (>= e3 + mid) +\end{code} + + %********************************************************* %* * \subsection{Instances for @Int@} @@ -227,17 +248,10 @@ instance (Integral a) => Enum (Ratio a) where toEnum n = fromInt n :% 1 fromEnum = fromInteger . truncate - enumFrom = bounded_iterator True (1) - enumFromThen n m = bounded_iterator (diff >= 0) diff n - where diff = m - n - -bounded_iterator :: (Ord a, Num a) => Bool -> a -> a -> [a] -bounded_iterator inc step v - | inc && v > new_v = [v] -- oflow - | not inc && v < new_v = [v] -- uflow - | otherwise = v : bounded_iterator inc step new_v - where - new_v = v + step + enumFrom = numericEnumFrom + enumFromThen = numericEnumFromThen + enumFromTo = numericEnumFromTo + enumFromThenTo = numericEnumFromThenTo \end{code} -- 1.7.10.4