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 theRead1
andRead2
typeclasses. The current definition ofRead1
is this: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 forString -> [(a, String)]
). This sort of parser is very slow (the docs even admit as such), and moreover, the actualRead
typeclass on which Read1 is based tries to avoid using it whenever possible.The
Read
typeclass has this definition currently: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 derivingRead
instances, GHC defines them in terms ofreadPrec
, and gives the other methods default definitions that leveragereadPrec
.For the sake of consistency, I propose adding analogous methods to
Read1
andRead2
that use theReadPrec
datatype. For example, here is how I would changeRead1
: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 newRead1
/Read2
definitions would look like, including what the default definitions of the other methods would be.
Diff coming soon.
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.1 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |