[Haskell] What are possible causes of "C stack overflow" in Hugs?

Koji Nakahara yu- at div.club.ne.jp
Thu Feb 5 16:38:48 EST 2004


On Wed, 04 Feb 2004 23:00:50 +0000
Graham Klyne <gk at ninebynine.org> wrote:

> I'm getting a "C stack overflow" error from Hugs when processing a 
> moderately large dataset, but not doing anything that looks unreasonably 
> complex or involved.
<snip>
> 
> I think the function graphLabels1 is set to call itself recursively to a 
> depth of a little over 1000.  Can this kind of recursion blow the Hugs stack?

"foldl f x xs" generally requires #xs (the number of elements of xs) stacks to be evaluated.
Note that ls(the second argument of graphLabels1) is not evaluated until
> graphLabels1 [] ls     = ls
.

>                           foldl (flip addSetElem) ls (arcLabels t)
ls is also defined by a foldl and its ls is also ...

So, let gs = [g_1, g_2, ..., g_N],
you need at least \sum_{n = 1}^N #g_n stacks.  Is'n it large?

The simplest and safest solution is to change foldl to foldl', but it produces
the unnecessary evaluation of `elem`s in addSetElem's.

I think that
> import DeepSeq 
> {- or
> f $!! x = force x `seq` f x
> 		where force [] = ()
> 					force (x:xs) = x `seq` force xs
> -}
> ...
> graphLabels1 (t:gs) ls = graphLabels1 gs $!! foldl (flip addSetElem) ls (arcLabels t
is better in your case.

Sorry for my poor English and hope it helps,

Koji Nakahara


More information about the Haskell mailing list