megaparsec
megaparsec copied to clipboard
MonadAccum instance for ParsecT
There exists an instance
(Stream s, MonadState st m) => MonadState st (ParsecT e s m)
and State
is more expressive than Writer
, in the sense that any State monad can implement the MonadWriter
interface for monoidal state. Hence I wonder why there are no instances
(Stream s, MonadAccum w m) => MonadAccum w (ParsecT e s m)
(Stream s, MonadWriter w m) => MonadWriter w (ParsecT e s m)
I claim that accumulating some value while parsing is a frequent use case and therefore should be supported by any parsing library. After all, ParsecT
does accumulate its own errors and hints. Certainly tell
a.k.a. add
is easy enough to implement:
addP :: MonadAccum w m => w -> ParsecT e s m ()
addP w = ParsecT (\s _ _ whenOK _ -> add w >> (whenOK () s mempty))
and look
can be implemented via lift
:
lookP :: MonadAccum w m => ParsecT e s m w
lookP = lift look
MonadAccum
exists only in mtl >= 2.3
and the current lower bound is 2.2.2 so the bound in the dependency must be increased to be able to implement the instance.
It is not there because at the time no such thing as MonadAccum
existed in mtl
. You are very welcome to open a PR adding this instance, which I will gladly merge.
It's clear about MonadAccum
, but why there is no MonadWriter
instance (it seems to be old enough)? Are there any problems with it?
MonadWriter can be done, but it is not so straightforward because of listen and pass. I have an implementation and file a PR asap.
Olaf
Von: Lev Dvorkin @.> Gesendet: Dienstag, 20. Juni 2023 22:46 An: mrkkrp/megaparsec @.> Cc: Olaf Klinke @.>; Author @.> Betreff: Re: [mrkkrp/megaparsec] MonadAccum instance for ParsecT (Issue #522)
It's clear about MonadAccum, but why there is no MonadWriter instance (it seems to be old enough)? Are there any problems with it?
— Reply to this email directly, view it on GitHubhttps://github.com/mrkkrp/megaparsec/issues/522#issuecomment-1599471440, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AUGVV4IKWGZAYJUAPO2F3A3XMID3PANCNFSM6AAAAAAWNCCIAA. You are receiving this because you authored the thread.Message ID: @.***>
The PR is able to merge.