Daniel Fischer daniel.is.fischer at web.de
Tue Jan 12 08:00:25 EST 2010

```Am Dienstag 12 Januar 2010 11:30:07 schrieb Heinrich Apfelmus:
> Tricky stuff. It is known that pairs/records are prone to unwanted
> retention, see for example the recent thread
>
>
> or
>
>   Jan Sparud. Fixing some space leaks without a garbage collector.
>   http://citeseer.ist.psu.edu/240848.html

"CiteSeerx is momentarily busy, Please try us again, in a few moments.
We apologize for any inconvenience."

:( tried and re-tried.

Took http://bert.md.chalmers.se/pub/cs-reports/papers/sparud/spaceleak-
fix.ps.gz finally

>
> It is exactly because these troubles that I'm advocating the original
> VIP data structure that buries the dorks (that name is awesome :D) deep
> inside the structure. :)
>
>
> In any case, it appears to me that the lazy pattern match in  mergeSP
> is actually unnecessary! This is because  mergeSP  returns a pair
> constructor immediately, so infinite nesting works even when the second
> argument is demanded. In other words,
>
>   mergeSP :: Integral a => People a -> People a -> People a
>   mergeSP (P a b) (P c d) = P (a ++ bc) (merge b' d)
>       where
>         P bc b' = spMerge b c
>         spMerge [] ys = P [] ys
>         spMerge xs [] = P [] xs
>         spMerge xs@(x:xt) ys@(y:yt) = case compare x y of
>                 LT -> celebrate x (spMerge xt ys)
>                 EQ -> celebrate x (spMerge xt yt)
>                 GT -> celebrate y (spMerge xs yt)
>
> should work fine and do away with the memory issue because the pair is
> now deconstructed immediately.

No, <<loop>>. For the reason you stated below.
In

tfold f (a:b:c:xs) = (a `f` (b `f` c)) `f` smartfold f xs

, it must compute smartfold f xs too early to match it against P c d. The
compiler can't see that smartfold mergeSP always returns a P [well, it
might return _|_, mightn't it?].

>
> Hm, a strict second argument might however mean that the tree produced
> by  tfold  is demanded too early.
>

>
>
> Regards,
> Heinrich Apfelmus
>
> --
> http://apfelmus.nfshost.com

```