[Haskell-cafe] Parsec question

Thomas Conway drtomc at gmail.com
Thu Jun 21 06:36:56 EDT 2007

On 6/21/07, Dave Tapley <dukedave at gmail.com> wrote:
> > primary = (identifier >>= (return . PrimaryIdentifier)) <|> (stringLiteral >>= (return . PrimaryLiteral))
> > identifier = (many1 letter) >>= (return . Identifier)
> > stringLiteral = (char '\'') >> (manyTill anyChar (char '\'')) >>= (return . StringLiteral)

I have found this a sufficiently common pattern that I have a little
combinator to tidy it up:

p `with` f = p >>= (return . f)

so I can write

primary = (identifier `with` PrimaryIdentifier) <|> (stringLiteral
`with` PrimaryLiteral)

Obviously you could write it in terms of liftM, choose a different name, &c, &c.

FWIW, the other little combinator I invariably use is

p `returning` x = p >>= (\_ -> return x)

which I end up calling with () as the second argument so often
(especially during development), I usually have another combinator

void p = p >> return ()

Dr Thomas Conway
drtomc at gmail.com

Silence is the perfectest herald of joy:
I were but little happy, if I could say how much.

More information about the Haskell-Cafe mailing list