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.

As far as I can tell, the code causing the problem is about here:
[[
--  Return list of distinct labels used in a graph

graphLabels :: (Label lb) => [Arc lb] -> [lb]
graphLabels gs = graphLabels1 gs []

graphLabels1 (t:gs) ls = graphLabels1 gs $
                         foldl (flip addSetElem) ls (arcLabels t)
graphLabels1 [] ls     = ls
]]

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?

This code has been working quite happily for some time. The called function arcLabels is quite trivial, and addSetElem is pretty simple too:

[[
addSetElem :: (Eq a) => a -> [a] -> [a]
addSetElem e es = if e `elem` es then es else e:es
]]

...

I changed the function 'graphLabels' thus:
[[
graphLabels :: (Label lb) => [Arc lb] -> [lb]
graphLabels gs = nub $ concat $ map arcLabels gs
]]
and the C stack overflow goes away. But I've been burned in the past with serious performance problems using nub, so I'm wary of this.


#g


------------ Graham Klyne For email: http://www.ninebynine.org/#Contact

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

Reply via email to