Jan Stolarek <jan.stola...@p.lodz.pl> wrote:

> I will be writing a parser in Haskell and I wonder how to approach the
> problem. My first thought was to use monadic parser, e.g. like the one
> described by Hutton and Meijer in "Monadic Parsing in Haskell"
> functional pearl. But then I stumbled upon this:
>
> https://github.com/alephnullplex/cradle/tree/master/code/src/Lbach/Parser
>
> Monadic parser seems extremely verbose and not very straightforward
> compared to this one. I started to wonder whether I should use monadic
> parser for the sake of it being monadic or should I just go with the
> combinator approach? Any thoughts will be appreciated before I shoot
> myself in the foot :)

A monadic parser /is/ a combinator parser.  The code you linked just
doesn't go as far as wrapping it up with a newtype and providing a monad
instance.

Monadic parsers aren't verbose, because there is the applicative style.
Let's rewrite this noisy example (assuming automatic backtracking):

    inParens c = do
        char '('
        x <- c
        char ')'
        return x

All monads are also applicative functors, which means that you can use
applicative style to write this one more nicely:

    inParens c = char '(' *> c <* char ')'

If your parser is also an IsString you could even write:

    inParens c = "(" *> c <* ")"

If that's not nice and concise I don't know what is. =)


Greets,
Ertugrul

-- 
Not to be or to be and (not to be or to be and (not to be or to be and
(not to be or to be and ... that is the list monad.

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to