[Haskell-cafe] Attoparsec: Limiting Parsers to N Bytes, or Combing Parsers?

Michael Craig mkscrg at gmail.com
Sat Sep 24 05:31:24 CEST 2011


I agree on all counts! The hex-handling logic here is so straightforward
that it's hardly worth bothering with. In fact, my application's code as it
stands looks very similar to what you wrote. I'm really asking because I
want to be more "fluent" in attoparsec.

So the question remains: is there a way to limit a parser to a finite chunk
of input? Perhaps a way to run the 'take n' parser on the input and then run
another parser on its result? This smells like monadic behavior, but of
course with different semantics than the Monad instance for Parser.

Mike S Craig
(908) 328 8030


On Fri, Sep 23, 2011 at 11:23 PM, Evan Laforge <qdunkan at gmail.com> wrote:

> BTW you probably want 'data Color = Color !Word8 !Word8 !Word8'
>
> On Fri, Sep 23, 2011 at 8:21 PM, Evan Laforge <qdunkan at gmail.com> wrote:
> > On Fri, Sep 23, 2011 at 8:04 PM, Michael Craig <mkscrg at gmail.com> wrote:
> >> Suppose we want to parse a 24-bit hex color value:
> >> input :: ByteString
> >> input = "af093c blah blah blah"
> >> type Color = (Word8, Word8, Word8)
> >>
> >> Attoparsec.Char8 exports a nice hexadecimal parser, but it consumes all
> >> available hex-flavored input. I'd like to make it consume exactly two
> bytes,
> >> so I could write my color parser like this:
> >>
> >> color :: Parser Color
> >> color = do
> >>     r <- hex2
> >>     g <- hex2
> >>     b <- hex2
> >>     return $ Color (r, g, b)
> >> hex2 :: Parser Word8
> >> hex2 = ???
> >>
> >> So my question is "how do I write hex2?" I could easily rewrite
> hexadecimal,
> >> but it would be nicer to reuse its hex-handling logic.
> >
> > If it's easy enough to write inline, might as well do so.  And it's
> > fun with Applicative :)
> >
> > hex2 = (+) <$> ((*16) <$> higit) <*> higit
> > higit = subtract (fromEnum '0') <$> satisfy isHexDigit
> > color = Color <$> hex2 <*> hex2 <*> hex2
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110923/d514813b/attachment.htm>


More information about the Haskell-Cafe mailing list