On Wed, 04 Feb 2004 23:00:50 +0000 Graham Klyne <gk@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