[Haskell-beginners] Applicative Parsec

Brent Yorgey byorgey at seas.upenn.edu
Fri Nov 6 11:49:05 EST 2009


On Fri, Nov 06, 2009 at 05:22:04PM +0100, Matthias Guedemann wrote:
> 
> I wrote a converter from a textfile format to a csv file. In order to get more
> familiar with Haskell I wrote it using Parsec.
> At first I had some difficulties and the monadic version seemed easier, but now
> it works as Applicative version and Parsec seems really straightforward.
> 
> For me, the Applicative version looks more functional and the monadic version
> looks more imperative.

Indeed; thta's a good way of putting it.  Applicative looks more
functional since it corresponds to function application, but a special
sort of function application that carries along some sort of
"context".

> It seems that Applicative is enough for Parsers (think I
> remember a citation somewhere), but does it have a real advantage?

The Monad interface gives strictly more power: it allows you to give
names to intermediate results, and *decide what to do* later based on
those intermediate results.  With Applicative, the actions that you
perform must be fixed ahead of time.

For example, consider parsing a file which contains a positive
integer, followed by that many letters.  For example,

  3xyz
  12abcdefghijkl

are two instances of this format.  In order to parse this, a monadic
interface is required, since the result of parsing the number must be
used to decide how many things to parse after that.

However, for *many* purposes, an Applicative parsing interface is all
you need.  And if Applicative is enough, it's usually nicer/more
elegant than Monad. (And using the least powerful/most general thing
that works for your purpose is usually good style anyway.)

-Brent


More information about the Beginners mailing list