
(redirecting to haskell-cafe) Tom Pledger wrote:
| > 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'') = ...
"let" already is lazy -- putting a tilde there has no effect. In fact that tuple is produced from (x:r', ts'' ) even if (sqnc p ts') is _|_. (The "let" at the beginning of the function can be discovered to be strict by strictness analysis (which GHC does), because "r" is analyzed by the "case", and the pair needs to be deconstructed to find the value of "r".) Isaac