(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