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

Reply via email to