
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. If however something goes wrong, and prs fails, the whole function fails (error is thrown). Since [a] (result of decoding) is a lazy list, actual exception may be thrown at any moment the list is being processed, and exception handler may not be properly set. Is there any way to catch/detect failures inside the Get monad? It is not an instance of MonadError, so catchError does not work. Ideally, the function would keep decoding as long as it is possible, and upon the first failure of the parser, return whatever has been decoded. Thanks. ----------------------------------------------- * there is one intentional inaccuracy in this function: isEmpty is called _after_ decoding is tried, so an empty ByteString would cause parser failure and exception right away; this is used as a test case. -- Dimitry Golubovsky Anywhere on the Web