megaparsec icon indicating copy to clipboard operation
megaparsec copied to clipboard

Problematic `IsString` instance

Open j-mie6 opened this issue 1 year ago • 4 comments

Megaparsec defines an instance:

instance (a ~ Token s, IsString a, Eq a, Stream s, Ord e) => IsString (ParsecT e s m a)

Which allows for convenient syntax for parsing string symbols in a parser. However, the existence of this instance means that it is not possible to define a specialised instance for use with lexing logic (see this paper, page 8, section 3.3) without resorting to newtype hackery. This is arguably a more useful instance to have, because it can actually be used to clean up the logic of a completed parser.

Obviously, the issue here is that the instance is given in the same module as ParsecT's definition (as to not orphan it), but I would suggest actually orphaning it in a module where it is the only thing inside. That way, users can opt into this (indeed very sensible) default, and remove the import when they want to define their own specialised version. If orphaning really is to be avoided, I'd instead just recommend removing it.

In either case, this is a backwards incompatible change.

Keen to know your thoughts!

j-mie6 avatar Mar 02 '23 17:03 j-mie6