
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