From e007a7cad7f402caaedacf1933e38b55d744ac4b Mon Sep 17 00:00:00 2001 From: Bart Massey Date: Sat, 26 Jul 2008 08:04:44 +0000 Subject: [PATCH] applied patches to make enumFrom and friends strict in arguments as per the Report; closes ticket #1997 --- GHC/Num.lhs | 7 +++++-- GHC/Real.lhs | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/GHC/Num.lhs b/GHC/Num.lhs index 46cc03d..c92d03e 100644 --- a/GHC/Num.lhs +++ b/GHC/Num.lhs @@ -282,10 +282,13 @@ instance Enum Integer where #-} enumDeltaIntegerFB :: (Integer -> b -> b) -> Integer -> Integer -> b -enumDeltaIntegerFB c x d = x `c` enumDeltaIntegerFB c (x+d) d +enumDeltaIntegerFB c x d = x `seq` (x `c` enumDeltaIntegerFB c (x+d) d) enumDeltaInteger :: Integer -> Integer -> [Integer] -enumDeltaInteger x d = x : enumDeltaInteger (x+d) d +enumDeltaInteger x d = x `seq` x : enumDeltaInteger (x+d) d + -- strict accumulator, as for Int + -- so, head (drop 1000000 [1 .. ] works + -- patch by Don Stewart enumDeltaToIntegerFB c n x delta lim | delta >= 0 = up_fb c n x delta lim diff --git a/GHC/Real.lhs b/GHC/Real.lhs index d282058..6d1f6e0 100644 --- a/GHC/Real.lhs +++ b/GHC/Real.lhs @@ -201,10 +201,10 @@ These 'numeric' enumerations come straight from the Report \begin{code} numericEnumFrom :: (Fractional a) => a -> [a] -numericEnumFrom = iterate (+1) +numericEnumFrom n = numericEnumFromThen n (n + 1) numericEnumFromThen :: (Fractional a) => a -> a -> [a] -numericEnumFromThen n m = iterate (+(m-n)) n +numericEnumFromThen n m = n `seq` m `seq` n : numericEnumFromThen m (m+m-n) numericEnumFromTo :: (Ord a, Fractional a) => a -> a -> [a] numericEnumFromTo n m = takeWhile (<= m + 1/2) (numericEnumFrom n) -- 1.7.10.4