[Haskell-cafe] How to catch exception within the Get monad (the
Binary package)
Henning Thielemann
lemming at henning-thielemann.de
Sun Sep 5 03:30:53 EDT 2010
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-CappedList.html
or
http://hackage.haskell.org/packages/archive/explicit-exception/0.1.5/doc/html/Control-Monad-Exception-Asynchronous.html
with an enclosed list. The latter solution is the more general one, but
unfortunately it causes a space leak in GHC.
More information about the Haskell-Cafe
mailing list