John Lask wrote:
 :
 | The following code causes a "C stack overflow" in hugs (version 20051031)
 | but not in ghc (version 6.6)
 | The point of the exercise is to process a very large file lazily,
| returning the consumed and unconsumed parts (i.e. basic parser combinators).
 :
 | >     sqnc p ts = let ( r, ts' ) = p ts in case r of
 | >                          Nothing -> ([],ts')
| > Just x -> let (r',ts'') = (sqnc p ts') in (x:r', ts'' )
 :


I don't know how ghc is avoiding the stack overflow, but it looks like it's caused by strict pattern matching. The first call to sqnc wants reassurance that the second call is returning a pair (as opposed to _|_) before deciding that it's OK to return a pair.

Try putting a tilde in the recursive call, to make the pattern lazy.

    let ~(r',ts'') = ...

There's a recent thread on lazy patterns in the haskell-cafe list, too.

    http://www.haskell.org//pipermail/haskell-cafe/2007-September/031974.html

Regards,
Tom


_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to