[Haskell-cafe] Problems with strictness analysis?

Derek Elkins derek.a.elkins at gmail.com
Mon Nov 3 13:22:44 EST 2008


On Mon, 2008-11-03 at 13:31 +0100, Patai Gergely wrote:
> Hi everyone,
> 
> I was experimenting with simple accumulator functions, and found that an
> apparently tail recursive function can easily fill the stack. Playing
> around with ghc and jhc gave consistently unpleasant results. Look at
> this program:
> 
> %%%%%%%%%%%
> 
> -- ghc: no, ghc -O3: yes, jhc: no
> isum 0 s = s
> isum n s = isum (n-1) (s+n)
> 
> -- ghc: no, ghc -O3: no, jhc: yes (because gcc -O3 is clever)
> rsum 0 = 0
> rsum n = n + rsum (n-1)
> 
> main = case isum 10000000 0 {- rsum 10000000 -} of
>          0 -> print 0
>          x -> print x
> 
> %%%%%%%%%%%
> 
> I would expect the analysis to find out that the result of the function
> is needed in every case (since we are matching a pattern to it), yet I
> need to add a $! to the recursive call of isum to get a truly iterative
> function. It's interesting how ghc and jhc seem to diverge, one
> favouring the "iterative" version, the other the "recursive" one
> (although it only works because gcc figures out that the function can be
> expressed in an iterative way).
> 
> Of course this is a real problem when I'm trying to write an actual
> program, since it means I can be bitten by the laziness bug any time...
> Is there any solution besides adding strictness annotations? Can I
> expect the compiler to handle this situation better in the foreseeable
> future?

Don't write code that relies on strictness analysis for correctness.



More information about the Haskell-Cafe mailing list