[Haskell-beginners] Stack space overflow: using strict accumulator still fails
Hugo Ferreira
hmf at inescporto.pt
Thu Oct 27 12:45:11 CEST 2011
Hello,
Have a stack overflow but cannot see why (read up on [1],
may be missing something trivial). Once again using the
http://nlpwp.org/ book code. If I call the following function,
it blows its top:
scoreRule :: TransformationRule -> Z.Zipper (Tag, Tag) -> Int
scoreRule r z = nCorrect - nIncorrect
where (nCorrect, nIncorrect) = scoreRule_ r z
scoreRule_ :: TransformationRule -> Z.Zipper (Tag, Tag) -> (Int, Int)
scoreRule_ r = Z.foldlz' (scoreElem r) (0, 0)
where scoreElem r s@(nCorrect, nIncorrect) z =
case ruleApplication r z of
Just tag -> if tag == correct then
(nCorrect + 1, nIncorrect)
else
(nCorrect, nIncorrect + 1)
Nothing -> s
where (correct, _) = Z.cursor z
however I see that the eager version of foldlz is being used.
I also though that maybe ruleApplication my not be executing
immediately. But I cannot see why (added definition below for
reference).
Can anyone point out why this is not strict?
TIA,
Hugo F.
[1] http://www.haskell.org/haskellwiki/Stack_overflow
ruleApplication :: TransformationRule -> Z.Zipper (Tag, Tag) -> Maybe Tag
ruleApplication (NextTagRule (Replacement old new) next) z = do
(_, proposed) <- Z.safeCursor z
(_, nextProposed) <- rightCursor z
if proposed == old && nextProposed == next then Just new else Nothing
ruleApplication (PrevTagRule (Replacement old new) prev) z = do
(_, proposed) <- Z.safeCursor z
(_, prevProposed) <- leftCursor z
if proposed == old && prevProposed == prev then Just new else Nothing
ruleApplication (SurroundTagRule (Replacement old new) prev next) z = do
(_, proposed) <- Z.safeCursor z
(_, nextProposed) <- rightCursor z
(_, prevProposed) <- leftCursor z
if proposed == old && prevProposed == prev &&
nextProposed == next then Just new else Nothing
More information about the Beginners
mailing list