[Haskell-cafe] Parsec question

Tomasz Zielonka tomasz.zielonka at gmail.com
Thu Jun 21 02:28:04 EDT 2007


On Thu, Jun 21, 2007 at 03:34:54PM +0930, Levi Stephen wrote:
> Is there a way through combining types/parsers that the double do
> block in primary could be avoided?
> 
> I understand it's necessary right now because the parsers identifier
> and stringLiteral return different types, so I can't just write:
> 
> >i <- identifier <|> stringLiteral

You can use the fact that (GenParser tok st) is a monad and use liftM:

    i <- liftM PrimaryIdentifier identifier <|> liftM PrimaryLiteral stringLiteral

I often find it convenient to use "choice" instead of <|> for long more
complicated alternatives, for example like this:

primary =
    choice
        [ do
            i <- identifier
            return $ PrimaryIdentifier i
        , do
            l <- stringLiteral
            return $ PrimaryLiteral l
        ]

> So, I'm not sure whether my types need work,

I have a feeling that Identifier and Literal could just be type
synonyms, because newtype's don't seem to be neccesary or beneficial
here.  I could be wrong though - after all, I don't know your intentions
and the rest of the program.

Best regards
Tomek


More information about the Haskell-Cafe mailing list