Visitar URL original
MonadAccum instance for ParsecT · Issue #522 · mrkkrp/megaparsec · GitHub
Skip to content

MonadAccum instance for ParsecT #522

Closed

Description

@olafklinke

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

Activity

  1. olafklinke commented on Mar 30, 2023

    @olafklinke
    ContributorAuthor

    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.

  2. mrkkrp commented on Mar 31, 2023

    @mrkkrp
    Owner

    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.

  3. Lev135 commented on Jun 20, 2023

    @Lev135
    Contributor

    It's clear about MonadAccum, but why there is no MonadWriter instance (it seems to be old enough)? Are there any problems with it?

  4. olafklinke commented on Jun 21, 2023

    @olafklinke
    ContributorAuthor
  5. olafklinke commented on Jun 21, 2023

    @olafklinke
    ContributorAuthor

    The PR is able to merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions