Read1/Read2 don't have methods defined in terms of ReadPrec
Original Haskell libraries mailing list discussion: https://mail.haskell.org/pipermail/libraries/2016-June/027102.html
GHC 8.0 added the Data.Functor.Classes module to
base, and with it the
Read2typeclasses. The current definition of
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 admit as such), and moreover, the actual
Readtypeclass on which Read1 is based tries to avoid using it whenever possible.
Readtypeclass has this definition currently:
class Read a where readsPrec :: Int -> ReadS a readList :: ReadS [a] readPrec :: ReadPrec a readListPrec :: ReadPrec [a]
ReadPrecis a much more efficient parser datatype. When deriving
Readinstances, GHC defines them in terms of
readPrec, and gives the other methods default definitions that leverage
For the sake of consistency, I propose adding analogous methods to
Read2that use the
ReadPrecdatatype. For example, here is how I would change
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 full gist with a sketch of what the new
Read2definitions would look like, including what the default definitions of the other methods would be.
Diff coming soon.