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

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.

Harald.



                                                                                
                                                 
                      Andrew Pimlott                                            
                                                 
                      <[EMAIL PROTECTED]      To:       Harald ROTTER <[EMAIL 
PROTECTED]>                                 
                      >                        cc:       haskell@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
the
> 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 ?
(I
> 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 ...

Andrew



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

Reply via email to