[Haskell-beginners] Stack space overflow: using strict accumulator still fails
Daniel Fischer
daniel.is.fischer at googlemail.com
Mon Oct 31 23:31:21 CET 2011
On Monday 31 October 2011, 23:12:03, Hugo Ferreira wrote:
> You mean, I have to use something like:
>
> where
> (correct,_) = Z.cursor z
>
> instead of
>
> where (correct,_) = Z.cursor z
Yes.
>
> I googled the rules and found
> http://en.wikibooks.org/wiki/Haskell/Indentation. Doesn't seem to be a
> requirement.
Hence the ";)".
> >
> > Been a bugger to hunt down, but I finally found it.
> > The culprit is *drumroll, ba-dum tish*:
> > a one-character typo in Data.List.Zipper.
> > foldlz' isn't. The recursive call is to foldlz, not foldlz'.
>
> Now I am baffled B-(
>
> The package docs state:
> foldlz' is foldlz with a strict accumulator
>
> Why would/should one not use the strict version here?
Because there's a typo in the implementation (notified the maintainer).
> What do you mean when you say "recursive call"?
Let's look at lists first.
The specification in the standard is
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
^^^^^
recursive call to foldl
Very similar for the list zipper, we have
foldlz :: (b -> Zipper a -> b) -> b -> Zipper a -> b
foldlz f x z
| endp z = x
| otherwise = foldlz f (f x z) (right z)
^^^^^^
And for foldlz', the intention was
foldlz' :: (b -> Zipper a -> b) -> b -> Zipper a -> b
foldlz' f x z
| endp z = x
| otherwise = acc `seq` foldlz' f acc (right z)
where acc = f x z
but in the otherwise branch, the ' has been omitted, so instead of
recursively calling itself with the new accumulator, it calls foldlz.
More information about the Beginners
mailing list