A fancier Get monad or two (a la binary and binary-strict)

Johan Tibell johan.tibell at gmail.com
Wed Jul 30 11:16:59 EDT 2008


On Wed, Jul 30, 2008 at 9:26 AM, Duncan Coutts
<duncan.coutts at worc.ox.ac.uk> wrote:
> On Wed, 2008-07-30 at 02:23 +0100, Chris Kuklewicz wrote:
>> Summary: I have two new Get-like monads for binary data (byte-aligned) that also
>>    (*) Suspend parsing and request more import when reading past the end of data.
>>        It is possible to respond with Nothing to indicate the hard end of data.
>>    (*) Return failures instead of calling error
>>    (*) Offer lookAhead,lookAheadM,lookAheadE like Data.Binary.Get
>>    (*) Are BinaryParser instances from Data.Binary.Strict.Class
>>    (*) Are Monad Transformers (and thus MonadIO)
>>    (*) Are MonadError,Plus,Reader,Writer,State and Applicative,Alternative
>>    (*) They differ because one is also MonadCont while the other is simpler
>>    (*) Simplified Non-transformer versions (applied to Identity) are defined
>
> [..]
>
> We'll have to look closely at the performance costs of the new features
> but my intuition is that a non-transformer but continuation based
> version that has error handling (and plus/alternative) and can request
> more input should have minimal cost.

I've written what I believe to be a similar, continuation-based
parser. I haven't uploaded my latest patches (basically faster
combinators) but the idea can be seen in the file here:

http://www.johantibell.com/cgi-bin/gitweb.cgi?p=hyena.git;a=blob;f=Hyena/Parser.hs;h=8086b11bfeb3bca15bfd16ec9c6a4b34aadf528e;hb=HEAD

The use case is parsing HTTP without resorting to lazy I/O.

Cheers,

Johan


More information about the Libraries mailing list