[Haskell-cafe] Re: A guess on stack-overflows - thunks build-up and tail recursion

G?uenther Schmidt redcom at fedoms.com
Sat Mar 21 10:34:22 EDT 2009


Hi Bas,


I'd like to share some thoughts with you.

Let's say I'm unable, for whatever reason, to force full evaluation of 
the accumulator during a foldl.

So I have this huge build up of thunks, which causes a stack overflow 
when the thunks are being reduced.

I wonder if I could write some sort of "chunked fold" which basically 
still produces the same amount of thunks but in a way so that the do not 
go on the stack all at once for reduction and thus do not cause a stack 
overflow. Kind of a tree.

I'd sincerely appreciate your thoughts on this.

Günther


Bas van Dijk schrieb:
> On Fri, Mar 20, 2009 at 2:01 PM, GüŸnther Schmidt <gue.schmidt at web.de> wrote:
>> The problem occurs when the result value is needed and thus the thunks need
>> to be reduced, starting with the outermost, which can't be reduced without
>> reducing the next one .... etc and it's these reduction steps that are
>> pushed on the stack until its size cause a stack-overflow.
> 
> Oh yes of course! Indeed a foldl:
> 
> foldl f z []     = z
> foldl f z (x:xs) = foldl f (z `f` x) xs
> 
> Is compiled to:
> 
> foldl f z xs = case xs of
>                  []     -> z
>                  (x:xs) -> let z' = f z x
>                            in foldl f z' x
> 
> So the z' is allocated on the heap.
> 
> So it turns out that in my " Foldr Foldl Foldl' " article the stack
> overflow message is listed to soon. It should actually be lised after
> the:
> 
> ((((((0 + 1) + 2) + 3) + 4) + ...) + 999999) + 1000000
> 
> I will fix it when I get home from work and nobody has beat me to it.
> 
> Thanks for pointing this out!
> 
> regards,
> 
> Bas




More information about the Haskell-Cafe mailing list