
GHC 8.0 added the [http://hackage.haskell.org/package/base-4.9.0.0/docs /Data-Functor-Classes.html Data.Functor.Classes] module to `base`, and with it the `Read1` and `Read2` typeclasses. The current definition of `Read1` is this:
{{{#!hs class Read1 f where liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a) liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [f a] }}}
There's a pretty big problem with this definition: it uses `ReadS` (a synonym for `String -> [(a, String)]`). This sort of parser is very slow (the docs even [http://hackage.haskell.org/package/base-4.9.0.0/docs/Text- ParserCombinators-ReadP.html#t:ReadS admit as such]), and moreover, the actual `Read` typeclass on which Read1 is based tries to avoid using it whenever possible.
The `Read` typeclass has this definition currently:
{{{#!hs class Read a where readsPrec :: Int -> ReadS a readList :: ReadS [a] readPrec :: ReadPrec a readListPrec :: ReadPrec [a] }}}
Where `ReadPrec` is a much more efficient parser datatype. When deriving `Read` instances, GHC defines them in terms of `readPrec`, and gives the other methods default definitions that leverage `readPrec`.
For the sake of consistency, I propose adding analogous methods to `Read1` and `Read2` that use the `ReadPrec` datatype. For example, here is how I would change `Read1`:
{{{#!hs class Read1 f where liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a) liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [f a] liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (f a) liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [f a] }}}
And similarly for `Read2`. Here is a [https://gist.github.com/RyanGlScott/7cdd11d6aa878e4229acf1a682beb1fc full gist] with a sketch of what the new `Read1`/`Read2` definitions would look
#12358: Read1/Read2 don't have methods defined in terms of ReadPrec -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: Type: feature | Status: new request | Priority: normal | Milestone: 8.2.1 Component: | Version: 8.0.1 libraries/base | Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- Original Haskell libraries mailing list discussion: https://mail.haskell.org/pipermail/libraries/2016-June/027102.html like, including what the default definitions of the other methods would be. Diff coming soon. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12358 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler