diff --git a/ghc/lib/std/PrelFloat.lhs b/ghc/lib/std/PrelFloat.lhs index bb85dcc7beb1dd4c8c304d7231f4b0dfcd464606..889c520e7e73cee813d84302f4d1e0782b0e35c5 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 530f12306c5fe366c1ffabc0807ef5d2caf73c66..e6d64d5eedcb820753f01bd0f35e49e03576ece4 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}