On 6/21/07, Dave Tapley <[EMAIL PROTECTED]> 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 ()

YMMV,
T.
--
Dr Thomas Conway
[EMAIL PROTECTED]

Silence is the perfectest herald of joy:
I were but little happy, if I could say how much.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to