[Haskell] Monadic parser combinators with logging

Harald ROTTER harald.rotter at sagem.com
Thu Aug 3 02:40:26 EDT 2006

Thanks for the hint, I will try to implement the suggested monadic

As for the MonadState declaration:

If I put
      instance MonadState PState Parser

then ghci complains:
      Illegal instance declaration for 'MonadState PState Parser'
            (The instance type must be of form (T a b c)
            where T is not a synonym, and a,b,c are distict type variables)
      In the instance declaration for 'MonadState PState Parser'

I found out that invoking ghci with "-fglasgow-exts" solves the issue nut I
have to admit that I do not really understand what's so special about this
instance declaration to make it require the extensions.


                      Andrew Pimlott                                                                                             
                      <andrew at pimlott.net      To:       Harald ROTTER <harald.rotter at sagem.com>                                 
                      >                        cc:       haskell at haskell.org                                                     
                                               Subject:  Re: [Haskell] Monadic parser combinators with logging                   
                      03.08.2006 02:54                                                                                           
                      Delivered date:                                                                                            
                      03.08.2006 02:54                                                                                           

On Wed, Aug 02, 2006 at 10:52:14AM +0200, Harald ROTTER wrote:
> newtype Parser a = Parser { runParser :: (PState -> [(a, PState)])}
> as the parsing monad with the Parser state  "PState" that contains the
> remaining input after matching and possibly some additional user defined
> state elements. I want to add logging such that the application of every
> element parser/parser combinator gets recorded in a string. In the end I
> want to print out the trace of all encountered parsers for successful and
> for failed matches.
> I tried to use the WriterT transformer to add a writer monad on top of
> Parser monad but for failed matches (i.e. runParser gives []) the log is
> also "lost" since WriterT gives a monad of "m (a,w)".

Excellent observation!  The order in which you apply monad transformers
matters.  "WriterT w Parser" keeps a separate output for each branch of
the parser.  If you stare at the definition of (>>=) for WriterT, you'll
see why this must be so.  Or, as you did, you can just look at the type.

> What I would look for is "(m a, w)".

Hmm, that looks like (if m is Parser) a parser plus some output.  I
think you'd rather have an answer plus some output, ie "([(a, PState)],
w)".  Hint:  Consider

    newtype Parser m a = Parser { runParser :: (PState -> m [(a, PState)])}

where m is a Monad.

> How can I make the Parser monad given above an instance of MonadState ?
> always get kind errors ...)

Did you switch up the order of parameters or something?  I don't get any
error using

    instance MonadState Int Parser where ...


More information about the Haskell mailing list