applied patches to make enumFrom and friends strict in arguments as per the Report...
authorBart Massey <bart@cs.pdx.edu>
Sat, 26 Jul 2008 08:04:44 +0000 (08:04 +0000)
committerBart Massey <bart@cs.pdx.edu>
Sat, 26 Jul 2008 08:04:44 +0000 (08:04 +0000)
GHC/Num.lhs
GHC/Real.lhs

index 46cc03d..c92d03e 100644 (file)
@@ -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 <dons@galois.com>                       
 
 enumDeltaToIntegerFB c n x delta lim
   | delta >= 0 = up_fb c n x delta lim
index d282058..6d1f6e0 100644 (file)
@@ -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)