[Haskell-cafe] Space leak whilst implementing streams
Udo Stenzel
u.stenzel at web.de
Sat Aug 26 10:51:44 EDT 2006
ephemeral.elusive at gmail.com wrote:
> I found a way to remove this space leak, however, I do not really
> understand why there was a space leak in the first place. I would
> really appreciate any light that could be shed on this.
> instance ArrowChoice SF where
> left (SF f)
> = SF (\xs -> combine xs (f [y | Left y <- xs]))
> where combine (Left _:xs) (z:zs) = Left z :combine xs zs
> combine (Right r:xs) zs = Right r:combine xs zs
> combine [] _ = []
The list comprehension is holding onto 'xs' until something of the 'zs'
is consumed. That only happens when 'xs' contains 'Left _', and your
input input stream doesn't. So the whole stream is leaked, which indeed
produces a linear space profile. The easiest way to correct it, is to
consume the list 'xs' only once:
instance ArrowChoice SF where
left (SF f) = SF (map f')
where f' (Left x) = Left (f x)
f' (Right y) = Right y
or simply
instance ArrowChoice SF where
left (SF f) = SF (map (left f))
> instance ArrowChoice SF' where
> left (SF' f)
> = SF' (\xs -> xs `combined` f (map drop_right xs))
> where combined = zipWith merge_left
Here you're also risking the leak of a whole copy of 'xs', but since you
end up consuming both lists at the same pace, nothing bad happens.
Udo.
--
Nicht alles was hinkt ist ein Vergleich.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org//pipermail/haskell-cafe/attachments/20060826/8fa7730b/attachment.bin
More information about the Haskell-Cafe
mailing list