
On Sun, 5 Sep 2010, Dimitry Golubovsky wrote:
Hi,
The following function* is supposed to decode a list of some serialized objects following each other in a lazy Bytestring:
many :: Get a -> Get [a]
many prs = many' [] where many' a = do s <- prs r <- isEmpty case r of True -> return (reverse a) False -> many' (s:a)
prs is a "parser" to decode a single object.
It is more efficient to call fmap (s:) (many prs) in the recursion in order to avoid the final 'reverse'. The way you have implemented the loop, the complete list must be hold in memory, even if it is consumed lazily. The trick to catch exceptions lazily is to make them explicit, either by using http://hackage.haskell.org/packages/archive/capped-list/1.2/doc/html/Data-Ca... or http://hackage.haskell.org/packages/archive/explicit-exception/0.1.5/doc/htm... with an enclosed list. The latter solution is the more general one, but unfortunately it causes a space leak in GHC.