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>


_______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to