On Saturday, 2002-12-07, 03:42, CET, Ashley Yakeley wrote:
> At 2002-12-06 15:57, Wolfgang Jeltsch wrote:
> > I cannot see how this relatively simple representation can be used to
> > describe certain parsers. If I would use Identity for baseMonad, I would
> > have a type for simple parsers. MyParser Identity would essentially be
> > token -> output.
>
> You can't use Identity for baseMonad. You would need to use something that
> managed a stream. The idea is that your source is something of type
> "baseMonad token", and by repeatedly calling source, you pull off individual
> tokens.
Hello Ashley,
now I understand what you mean. Obviously you misinterpreted the meaning of
baseMonad in
Parser baseMonad token output
where Parser means the parser type I described some mails ago. In fact,
Parser baseMonad token output
doesn't correspond to your
MyParser baseMonad token output
but to
forall s. MyParser (StateT s baseMonad) token output.
This shows that I could define Parser via
newtype
Monad baseMonad =>
Parser bm t o = Parser (forall s. StateT s bm t -> StateT s bm o)
instead of the "complicated way" I did.
The reason I didn't use this "simple implementation" is that with this
implementation the same state transformer may be invoked on the same state
multiple times. For example, consider a parser
tokenProvider :: Parser Maybe Char token
and two parsers
tokenConsumerOne :: Parser Maybe token output
and
tokenConsumerTwo :: Parser Maybe token output.
Now let's combine them in the term
tokenProvider >>> (tokenConsumerOne `mplus` tokenConsumerTwo).
The "simple" Parser implementation would, obviously, define (>>>) and mzero
the following way:
Parser parserOneFun >>> Parser parserTwoFun
= Parser (parserTwoFun . parserOneFun)
Parser parserOneFun `mzero` Parser parserTwoFun
= Parser (\source -> parserOneFun source `mplus` parserTwoFun source)
Now, if tokenConsumerOne fails (indicated by Nothing), tokenProvider would
parse tokens during the execution of tokenConsumerOne and parse the same
tokens from the same input again during the execution of tokenConsumerTwo.
Using my "complicated implementation", the tokens parsed during the execution
of tokenConsumerOne are reused during the execution of tokenConsumerTwo.
> [...]
What makes your implementation interesting, is the fact that it is far more
general than mine because it isn't restricted to state transformers. But I
can imagine that I don't need this extra generality. And for many monads m
(like, e.g., Identity or []) the type MyParser m is just not what you would
call a parser.
Wolfgang
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell