| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
Read
Synopsis
- class Read a where
- type ReadS a = String -> [(a, String)]
- reads :: Read a => ReadS a
- readMaybe :: Read a => String -> Maybe a
- readEither :: Read a => String -> Either String a
- readParen :: Bool -> ReadS a -> ReadS a
- readsData :: (String -> ReadS a) -> Int -> ReadS a
- readData :: ReadPrec a -> ReadPrec a
- readsUnaryWith :: (Int -> ReadS a) -> String -> (a -> t) -> String -> ReadS t
- readUnaryWith :: ReadPrec a -> String -> (a -> t) -> ReadPrec t
- readsBinaryWith :: (Int -> ReadS a) -> (Int -> ReadS b) -> String -> (a -> b -> t) -> String -> ReadS t
- readBinaryWith :: ReadPrec a -> ReadPrec b -> String -> (a -> b -> t) -> ReadPrec t
- class Read1 (f :: * -> *) where
- readsPrec1 :: (Read1 f, Read a) => Int -> ReadS (f a)
- readPrec1 :: (Read1 f, Read a) => ReadPrec (f a)
- liftReadListDefault :: Read1 f => (Int -> ReadS a) -> ReadS [a] -> ReadS [f a]
- liftReadListPrecDefault :: Read1 f => ReadPrec a -> ReadPrec [a] -> ReadPrec [f a]
- class Read2 (f :: * -> * -> *) where
- readsPrec2 :: (Read2 f, Read a, Read b) => Int -> ReadS (f a b)
- readPrec2 :: (Read2 f, Read a, Read b) => ReadPrec (f a b)
- liftReadList2Default :: Read2 f => (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [f a b]
- liftReadListPrec2Default :: Read2 f => ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b]
Documentation
Parsing of Strings, producing values.
Derived instances of Read make the following assumptions, which
derived instances of Show obey:
- If the constructor is defined to be an infix operator, then the
derived
Readinstance will parse only infix applications of the constructor (not the prefix form). - Associativity is not used to reduce the occurrence of parentheses, although precedence may be.
- If the constructor is defined using record syntax, the derived
Readwill parse only the record-syntax form, and furthermore, the fields must be given in the same order as the original declaration. - The derived
Readinstance allows arbitrary Haskell whitespace between tokens of the input string. Extra parentheses are also allowed.
For example, given the declarations
infixr 5 :^: data Tree a = Leaf a | Tree a :^: Tree a
the derived instance of Read in Haskell 2010 is equivalent to
instance (Read a) => Read (Tree a) where
readsPrec d r = readParen (d > app_prec)
(\r -> [(Leaf m,t) |
("Leaf",s) <- lex r,
(m,t) <- readsPrec (app_prec+1) s]) r
++ readParen (d > up_prec)
(\r -> [(u:^:v,w) |
(u,s) <- readsPrec (up_prec+1) r,
(":^:",t) <- lex s,
(v,w) <- readsPrec (up_prec+1) t]) r
where app_prec = 10
up_prec = 5Note that right-associativity of :^: is unused.
The derived instance in GHC is equivalent to
instance (Read a) => Read (Tree a) where
readPrec = parens $ (prec app_prec $ do
Ident "Leaf" <- lexP
m <- step readPrec
return (Leaf m))
+++ (prec up_prec $ do
u <- step readPrec
Symbol ":^:" <- lexP
v <- step readPrec
return (u :^: v))
where app_prec = 10
up_prec = 5
readListPrec = readListPrecDefaultWhy do both readsPrec and readPrec exist, and why does GHC opt to
implement readPrec in derived Read instances instead of readsPrec?
The reason is that readsPrec is based on the ReadS type, and although
ReadS is mentioned in the Haskell 2010 Report, it is not a very efficient
parser data structure.
readPrec, on the other hand, is based on a much more efficient ReadPrec
datatype (a.k.a "new-style parsers"), but its definition relies on the use
of the RankNTypes language extension. Therefore, readPrec (and its
cousin, readListPrec) are marked as GHC-only. Nevertheless, it is
recommended to use readPrec instead of readsPrec whenever possible
for the efficiency improvements it brings.
As mentioned above, derived Read instances in GHC will implement
readPrec instead of readsPrec. The default implementations of
readsPrec (and its cousin, readList) will simply use readPrec under
the hood. If you are writing a Read instance by hand, it is recommended
to write it like so:
instanceReadT wherereadPrec= ...readListPrec=readListPrecDefault
Methods
Arguments
| :: Int | the operator precedence of the enclosing
context (a number from |
| -> ReadS a |
attempts to parse a value from the front of the string, returning a list of (parsed value, remaining string) pairs. If there is no successful parse, the returned list is empty.
Derived instances of Read and Show satisfy the following:
That is, readsPrec parses the string produced by
showsPrec, and delivers the value that
showsPrec started with.
The method readList is provided to allow the programmer to
give a specialised way of parsing lists of values.
For example, this is used by the predefined Read instance of
the Char type, where values of type String should be are
expected to use double quotes, rather than square brackets.
Proposed replacement for readsPrec using new-style parsers (GHC only).
readListPrec :: ReadPrec [a] #
Proposed replacement for readList using new-style parsers (GHC only).
The default definition uses readList. Instances that define readPrec
should also define readListPrec as readListPrecDefault.
Instances
readMaybe :: Read a => String -> Maybe a #
Parse a string using the Read instance.
Succeeds if there is exactly one valid result.
>>>readMaybe "123" :: Maybe IntJust 123
>>>readMaybe "hello" :: Maybe IntNothing
Since: base-4.6.0.0
readsData :: (String -> ReadS a) -> Int -> ReadS a #
is a parser for datatypes where each alternative
begins with a data constructor. It parses the constructor and
passes it to readsData p dp. Parsers for various constructors can be constructed
with readsUnary, readsUnary1 and readsBinary1, and combined with
mappend from the Monoid class.
Since: base-4.9.0.0
readData :: ReadPrec a -> ReadPrec a #
is a parser for datatypes where each alternative
begins with a data constructor. It parses the constructor and
passes it to readData pp. Parsers for various constructors can be constructed
with readUnaryWith and readBinaryWith, and combined with
'(|)' from the Alternative class.
Since: base-4.10.0.0
readsUnaryWith :: (Int -> ReadS a) -> String -> (a -> t) -> String -> ReadS t #
matches the name of a unary data constructor
and then parses its argument using readsUnaryWith rp n c n'rp.
Since: base-4.9.0.0
readUnaryWith :: ReadPrec a -> String -> (a -> t) -> ReadPrec t #
matches the name of a unary data constructor
and then parses its argument using readUnaryWith rp n c'rp.
Since: base-4.10.0.0
readsBinaryWith :: (Int -> ReadS a) -> (Int -> ReadS b) -> String -> (a -> b -> t) -> String -> ReadS t #
matches the name of a binary
data constructor and then parses its arguments using readsBinaryWith rp1 rp2 n c n'rp1 and rp2
respectively.
Since: base-4.9.0.0
readBinaryWith :: ReadPrec a -> ReadPrec b -> String -> (a -> b -> t) -> ReadPrec t #
matches the name of a binary
data constructor and then parses its arguments using readBinaryWith rp1 rp2 n c'rp1 and rp2
respectively.
Since: base-4.10.0.0
class Read1 (f :: * -> *) where #
Lifting of the Read class to unary type constructors.
Both liftReadsPrec and liftReadPrec exist to match the interface
provided in the Read type class, but it is recommended to implement
Read1 instances using liftReadPrec as opposed to liftReadsPrec, since
the former is more efficient than the latter. For example:
instanceRead1T whereliftReadPrec= ...liftReadListPrec=liftReadListPrecDefault
For more information, refer to the documentation for the Read class.
Since: base-4.9.0.0
Minimal complete definition
Methods
liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a) #
readsPrec function for an application of the type constructor
based on readsPrec and readList functions for the argument type.
Since: base-4.9.0.0
liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [f a] #
readList function for an application of the type constructor
based on readsPrec and readList functions for the argument type.
The default implementation using standard list syntax is correct
for most types.
Since: base-4.9.0.0
liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (f a) #
readPrec function for an application of the type constructor
based on readPrec and readListPrec functions for the argument type.
Since: base-4.10.0.0
liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [f a] #
readListPrec function for an application of the type constructor
based on readPrec and readListPrec functions for the argument type.
The default definition uses liftReadList. Instances that define
liftReadPrec should also define liftReadListPrec as
liftReadListPrecDefault.
Since: base-4.10.0.0
Instances
readPrec1 :: (Read1 f, Read a) => ReadPrec (f a) #
Lift the standard readPrec and readListPrec functions through the
type constructor.
Since: base-4.10.0.0
liftReadListDefault :: Read1 f => (Int -> ReadS a) -> ReadS [a] -> ReadS [f a] #
A possible replacement definition for the liftReadList method.
This is only needed for Read1 instances where liftReadListPrec isn't
defined as liftReadListPrecDefault.
Since: base-4.10.0.0
liftReadListPrecDefault :: Read1 f => ReadPrec a -> ReadPrec [a] -> ReadPrec [f a] #
A possible replacement definition for the liftReadListPrec method,
defined using liftReadPrec.
Since: base-4.10.0.0
class Read2 (f :: * -> * -> *) where #
Lifting of the Read class to binary type constructors.
Both liftReadsPrec2 and liftReadPrec2 exist to match the interface
provided in the Read type class, but it is recommended to implement
Read2 instances using liftReadPrec2 as opposed to liftReadsPrec2,
since the former is more efficient than the latter. For example:
instanceRead2T whereliftReadPrec2= ...liftReadListPrec2=liftReadListPrec2Default
For more information, refer to the documentation for the Read class.
@since 4.9.0.0
Minimal complete definition
Methods
liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (f a b) #
readsPrec function for an application of the type constructor
based on readsPrec and readList functions for the argument types.
Since: base-4.9.0.0
liftReadList2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [f a b] #
readList function for an application of the type constructor
based on readsPrec and readList functions for the argument types.
The default implementation using standard list syntax is correct
for most types.
Since: base-4.9.0.0
liftReadPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec (f a b) #
readPrec function for an application of the type constructor
based on readPrec and readListPrec functions for the argument types.
Since: base-4.10.0.0
liftReadListPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b] #
readListPrec function for an application of the type constructor
based on readPrec and readListPrec functions for the argument types.
The default definition uses liftReadList2. Instances that define
liftReadPrec2 should also define liftReadListPrec2 as
liftReadListPrec2Default.
Since: base-4.10.0.0
Instances
readsPrec2 :: (Read2 f, Read a, Read b) => Int -> ReadS (f a b) #
Lift the standard readsPrec function through the type constructor.
Since: base-4.9.0.0
readPrec2 :: (Read2 f, Read a, Read b) => ReadPrec (f a b) #
Lift the standard readPrec function through the type constructor.
Since: base-4.10.0.0
liftReadList2Default :: Read2 f => (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [f a b] #
A possible replacement definition for the liftReadList2 method.
This is only needed for Read2 instances where liftReadListPrec2 isn't
defined as liftReadListPrec2Default.
Since: base-4.10.0.0
liftReadListPrec2Default :: Read2 f => ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b] #
A possible replacement definition for the liftReadListPrec2 method,
defined using liftReadPrec2.
Since: base-4.10.0.0