On Thu, Jul 05, 2007 at 10:49:17AM +0400, Miguel wrote:
R> Another interesting thing I've discovered is:
Prelude>> length [1..1000000]
R> 1000000
Prelude>> Data.List.genericLength [1..1000000]
R> *** Exception: stack overflow
R> Maybe there is something wrong with Integer ?
No, there is something wrong with genericLength:
Prelude> Data.List.foldl (+) 0 $ map (const 1) [1..1000000] :: Int
*** Exception: stack overflow
Prelude> Data.List.foldl' (+) 0 $ map (const 1) [1..1000000] :: Integer
1000000
From ghc/libraries/base/Data/List.hs:
genericLength :: (Num i) => [b] -> i
genericLength [] = 0
genericLength (_:l) = 1 + genericLength l
So genericLength is lazily building up unevaluated (+) expressions and
running out of stack space.
Is there a good reason for genericLength to be lazy?
Phil
--
http://www.kantaka.co.uk/ .oOo. public key: http://www.kantaka.co.uk/gpg.txt
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe