
Jules Bean wrote:
On 10 Dec 2004, at 15:34, Robert Dockins wrote:
So it should get "flattened," but it still doesn't run in constant space because the "x" parmeter isn't strict, so it will accumulate a bunch of closures like (((((((0)+1)+1)+1)+1)+1).... To make it strict, do something like this:
Isn't this what the strictness analyser is for? Doesn't GHC know that + for Int is strict in both arguments, and therefore it shouldn't accumulate a great big thunk like that?
Jules
Doesn't look like.... -------------- cnt.hs ------------------------ countlines = aux 0 where aux x [] = x aux x (_:ls) = aux (x+1) ls countlines' = aux 0 where aux x [] = x aux x (_:ls) | x `seq` False = undefined | otherwise = aux (x+1) ls ----------------------------------------------- $ /cygdrive/c/ghc/ghc-6.2.2/bin/ghci.exe ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.2.2, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\____/|_| Type :? for help. Loading package base ... linking ... done. Prelude> :load cnt.hs Compiling Main ( cnt.hs, interpreted ) Ok, modules loaded: Main. *Main> countlines [1..100000] 100000 *Main> countlines [1..1000000] *** Exception: stack overflow *Main> countlines' [1..1000000] 1000000 *Main>