[Haskell-beginners] functional parser type error

Brent Yorgey byorgey at seas.upenn.edu
Wed Apr 4 19:31:13 CEST 2012


On Wed, Apr 04, 2012 at 10:54:45AM +0100, felipe zapata wrote:
> Hi,
> The parser is defined
> 
> *type Parser a = String → [(a, String)]*
> *
> *
> But for me it is not pretty clear, why i need to
> make Parser a newtype instead of working
> with this one.

In order to use do-notation, Parser has to be an instance of Monad.
However, ((->) String) is already an instance of Monad, and it's not
the instance you want for Parser.  There cannot be two instances for
the same type, so you must wrap it in a newtype in order to make a
different instance.

The other option is to just implement your own operators

(>==) :: Parser a -> (a -> Parser b) -> Parser b
returnP :: a -> Parser a

and use those directly, though then you cannot use do-notation.

-Brent



More information about the Beginners mailing list