Parsing of Strings, producing values.
Minimal complete definition: readsPrec (or, for GHC only, readPrec)
Derived instances of Read make the following assumptions, which
derived instances of Text.Show.Show obey:
- If the constructor is defined to be an infix operator, then the
derived Read instance 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 Read
will parse only the record-syntax form, and furthermore, the fields
must be given in the same order as the original declaration.
- The derived Read instance 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 98 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 = 5
Note 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 = readListPrecDefault
| | Methods | | :: Int | the operator precedence of the enclosing
context (a number from 0 to 11).
Function application has precedence 10.
| -> ReadS a | |
| | | | | | |
| | Instances | Read Bool | Read Char | Read Double | Read Float | Read Int | Read Int8 | Read Int16 | Read Int32 | Read Int64 | Read Integer | Read Ordering | Read Word | Read Word8 | Read Word16 | Read Word32 | Read Word64 | Read () | Read Lexeme | Read CUIntMax | Read CIntMax | Read CUIntPtr | Read CIntPtr | Read CTime | Read CClock | Read CSigAtomic | Read CWchar | Read CSize | Read CPtrdiff | Read CLDouble | Read CDouble | Read CFloat | Read CULLong | Read CLLong | Read CULong | Read CLong | Read CUInt | Read CInt | Read CUShort | Read CShort | Read CUChar | Read CSChar | Read CChar | Read IOMode | Read ExitCode | Read BufferMode | Read GeneralCategory | Read IntPtr | Read WordPtr | Read Fd | Read CRLim | Read CTcflag | Read CSpeed | Read CCc | Read CUid | Read CNlink | Read CGid | Read CSsize | Read CPid | Read COff | Read CMode | Read CIno | Read CDev | Read SeekMode | Read Any | Read All | Read Version | Read a => Read ([] a) | (Integral a, Read a) => Read (Ratio a) | Read a => Read ([::] a) | Read a => Read (Maybe a) | (Read a, RealFloat a) => Read (Complex a) | Read a => Read (Last a) | Read a => Read (First a) | Read a => Read (Product a) | Read a => Read (Sum a) | Read a => Read (Dual a) | (Read a, Read b) => Read (Either a b) | (Read a, Read b) => Read ((,) a b) | (Ix a, Read a, Read b) => Read (Array a b) | (Read a, Read b, Read c) => Read ((,,) a b c) | (Read a, Read b, Read c, Read d) => Read ((,,,) a b c d) | (Read a, Read b, Read c, Read d, Read e) => Read ((,,,,) a b c d e) | (Read a, Read b, Read c, Read d, Read e, Read f) => Read ((,,,,,) a b c d e f) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g) => Read ((,,,,,,) a b c d e f g) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) => Read ((,,,,,,,) a b c d e f g h) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i) => Read ((,,,,,,,,) a b c d e f g h i) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j) => Read ((,,,,,,,,,) a b c d e f g h i j) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k) => Read ((,,,,,,,,,,) a b c d e f g h i j k) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l) => Read ((,,,,,,,,,,,) a b c d e f g h i j k l) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m) => Read ((,,,,,,,,,,,,) a b c d e f g h i j k l m) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m, Read n) => Read ((,,,,,,,,,,,,,) a b c d e f g h i j k l m n) | (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m, Read n, Read o) => Read ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o) |
|
|