Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > f9b127c02f56e71454a7233185e51eb4 > files > 871

ghc-base-devel-4.3.1.0-16.fc15.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>GHC/Read.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_GHC -XNoImplicitPrelude #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# OPTIONS_HADDOCK hide #-}</span>
<a name="line-3"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-4"></a><span class='hs-comment'>-- |</span>
<a name="line-5"></a><span class='hs-comment'>-- Module      :  GHC.Read</span>
<a name="line-6"></a><span class='hs-comment'>-- Copyright   :  (c) The University of Glasgow, 1994-2002</span>
<a name="line-7"></a><span class='hs-comment'>-- License     :  see libraries/base/LICENSE</span>
<a name="line-8"></a><span class='hs-comment'>-- </span>
<a name="line-9"></a><span class='hs-comment'>-- Maintainer  :  cvs-ghc@haskell.org</span>
<a name="line-10"></a><span class='hs-comment'>-- Stability   :  internal</span>
<a name="line-11"></a><span class='hs-comment'>-- Portability :  non-portable (GHC Extensions)</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- The 'Read' class and instances for basic data types.</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-comment'>-- #hide</span>
<a name="line-18"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Read</span>
<a name="line-19"></a>  <span class='hs-layout'>(</span> <span class='hs-conid'>Read</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>   <span class='hs-comment'>-- class</span>
<a name="line-20"></a>
<a name="line-21"></a>  <span class='hs-comment'>-- ReadS type</span>
<a name="line-22"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>ReadS</span>      <span class='hs-comment'>-- :: *; = String -&gt; [(a,String)]</span>
<a name="line-23"></a>
<a name="line-24"></a>  <span class='hs-comment'>-- H98 compatibility</span>
<a name="line-25"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>lex</span>         <span class='hs-comment'>-- :: ReadS String</span>
<a name="line-26"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>lexLitChar</span>  <span class='hs-comment'>-- :: ReadS String</span>
<a name="line-27"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>readLitChar</span> <span class='hs-comment'>-- :: ReadS Char</span>
<a name="line-28"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>lexDigits</span>   <span class='hs-comment'>-- :: ReadS String</span>
<a name="line-29"></a>
<a name="line-30"></a>  <span class='hs-comment'>-- defining readers</span>
<a name="line-31"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>lexP</span>       <span class='hs-comment'>-- :: ReadPrec Lexeme</span>
<a name="line-32"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>paren</span>      <span class='hs-comment'>-- :: ReadPrec a -&gt; ReadPrec a</span>
<a name="line-33"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>parens</span>     <span class='hs-comment'>-- :: ReadPrec a -&gt; ReadPrec a</span>
<a name="line-34"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>list</span>       <span class='hs-comment'>-- :: ReadPrec a -&gt; ReadPrec [a]</span>
<a name="line-35"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>choose</span>     <span class='hs-comment'>-- :: [(String, ReadPrec a)] -&gt; ReadPrec a</span>
<a name="line-36"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>readListDefault</span><span class='hs-layout'>,</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-37"></a>
<a name="line-38"></a>  <span class='hs-comment'>-- Temporary</span>
<a name="line-39"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>readParen</span>
<a name="line-40"></a>
<a name="line-41"></a>  <span class='hs-comment'>-- XXX Can this be removed?</span>
<a name="line-42"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>readp</span>
<a name="line-43"></a>  <span class='hs-layout'>)</span>
<a name="line-44"></a> <span class='hs-keyword'>where</span>
<a name="line-45"></a>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>ParserCombinators</span><span class='hs-varop'>.</span><span class='hs-conid'>ReadP</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>P</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>ParserCombinators</span><span class='hs-varop'>.</span><span class='hs-conid'>ReadP</span>
<a name="line-49"></a>  <span class='hs-layout'>(</span> <span class='hs-conid'>ReadP</span>
<a name="line-50"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>ReadS</span>
<a name="line-51"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>readP_to_S</span>
<a name="line-52"></a>  <span class='hs-layout'>)</span>
<a name="line-53"></a>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Read</span><span class='hs-varop'>.</span><span class='hs-conid'>Lex</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>L</span>
<a name="line-55"></a><span class='hs-comment'>-- Lex exports 'lex', which is also defined here,</span>
<a name="line-56"></a><span class='hs-comment'>-- hence the qualified import.</span>
<a name="line-57"></a><span class='hs-comment'>-- We can't import *anything* unqualified, because that</span>
<a name="line-58"></a><span class='hs-comment'>-- confuses Haddock.</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>ParserCombinators</span><span class='hs-varop'>.</span><span class='hs-conid'>ReadPrec</span>
<a name="line-61"></a>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-cpp'>#ifndef __HADDOCK__</span>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Unicode</span>       <span class='hs-layout'>(</span> <span class='hs-varid'>isDigit</span> <span class='hs-layout'>)</span>
<a name="line-66"></a><span class='hs-cpp'>#endif</span>
<a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Num</span>
<a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Real</span>
<a name="line-69"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Float</span> <span class='hs-conid'>()</span>
<a name="line-70"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Show</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span>
<a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Arr</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="readParen"></a><span class='hs-comment'>-- | @'readParen' 'True' p@ parses what @p@ parses, but surrounded with</span>
<a name="line-2"></a><span class='hs-comment'>-- parentheses.</span>
<a name="line-3"></a><span class='hs-comment'>--</span>
<a name="line-4"></a><span class='hs-comment'>-- @'readParen' 'False' p@ parses what @p@ parses, but optionally</span>
<a name="line-5"></a><span class='hs-comment'>-- surrounded with parentheses.</span>
<a name="line-6"></a><span class='hs-definition'>readParen</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadS</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadS</span> <span class='hs-varid'>a</span>
<a name="line-7"></a><span class='hs-comment'>-- A Haskell 98 function</span>
<a name="line-8"></a><span class='hs-definition'>readParen</span> <span class='hs-varid'>b</span> <span class='hs-varid'>g</span>   <span class='hs-keyglyph'>=</span>  <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>mandatory</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>optional</span>
<a name="line-9"></a>                   <span class='hs-keyword'>where</span> <span class='hs-varid'>optional</span> <span class='hs-varid'>r</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>g</span> <span class='hs-varid'>r</span> <span class='hs-varop'>++</span> <span class='hs-varid'>mandatory</span> <span class='hs-varid'>r</span>
<a name="line-10"></a>                         <span class='hs-varid'>mandatory</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-11"></a>                                <span class='hs-layout'>(</span><span class='hs-str'>"("</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lex</span> <span class='hs-varid'>r</span>
<a name="line-12"></a>                                <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>optional</span> <span class='hs-varid'>s</span>
<a name="line-13"></a>                                <span class='hs-layout'>(</span><span class='hs-str'>")"</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lex</span> <span class='hs-varid'>t</span>
<a name="line-14"></a>                                <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span>
</pre>\end{code}


%*********************************************************
%*                                                      *
\subsection{The @Read@ class}
%*                                                      *
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- class Read</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-comment'>-- | Parsing of 'String's, producing values.</span>
<a name="line-5"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><span class='hs-comment'>-- Minimal complete definition: 'readsPrec' (or, for GHC only, 'readPrec')</span>
<a name="line-7"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><span class='hs-comment'>-- Derived instances of 'Read' make the following assumptions, which</span>
<a name="line-9"></a><span class='hs-comment'>-- derived instances of 'Text.Show.Show' obey:</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- * If the constructor is defined to be an infix operator, then the</span>
<a name="line-12"></a><span class='hs-comment'>--   derived 'Read' instance will parse only infix applications of</span>
<a name="line-13"></a><span class='hs-comment'>--   the constructor (not the prefix form).</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- * Associativity is not used to reduce the occurrence of parentheses,</span>
<a name="line-16"></a><span class='hs-comment'>--   although precedence may be.</span>
<a name="line-17"></a><span class='hs-comment'>--</span>
<a name="line-18"></a><span class='hs-comment'>-- * If the constructor is defined using record syntax, the derived 'Read'</span>
<a name="line-19"></a><span class='hs-comment'>--   will parse only the record-syntax form, and furthermore, the fields</span>
<a name="line-20"></a><span class='hs-comment'>--   must be given in the same order as the original declaration.</span>
<a name="line-21"></a><span class='hs-comment'>--</span>
<a name="line-22"></a><span class='hs-comment'>-- * The derived 'Read' instance allows arbitrary Haskell whitespace</span>
<a name="line-23"></a><span class='hs-comment'>--   between tokens of the input string.  Extra parentheses are also</span>
<a name="line-24"></a><span class='hs-comment'>--   allowed.</span>
<a name="line-25"></a><span class='hs-comment'>--</span>
<a name="line-26"></a><span class='hs-comment'>-- For example, given the declarations</span>
<a name="line-27"></a><span class='hs-comment'>--</span>
<a name="line-28"></a><span class='hs-comment'>-- &gt; infixr 5 :^:</span>
<a name="line-29"></a><span class='hs-comment'>-- &gt; data Tree a =  Leaf a  |  Tree a :^: Tree a</span>
<a name="line-30"></a><span class='hs-comment'>--</span>
<a name="line-31"></a><span class='hs-comment'>-- the derived instance of 'Read' in Haskell 98 is equivalent to</span>
<a name="line-32"></a><span class='hs-comment'>--</span>
<a name="line-33"></a><span class='hs-comment'>-- &gt; instance (Read a) =&gt; Read (Tree a) where</span>
<a name="line-34"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-35"></a><span class='hs-comment'>-- &gt;         readsPrec d r =  readParen (d &gt; app_prec)</span>
<a name="line-36"></a><span class='hs-comment'>-- &gt;                          (\r -&gt; [(Leaf m,t) |</span>
<a name="line-37"></a><span class='hs-comment'>-- &gt;                                  ("Leaf",s) &lt;- lex r,</span>
<a name="line-38"></a><span class='hs-comment'>-- &gt;                                  (m,t) &lt;- readsPrec (app_prec+1) s]) r</span>
<a name="line-39"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-40"></a><span class='hs-comment'>-- &gt;                       ++ readParen (d &gt; up_prec)</span>
<a name="line-41"></a><span class='hs-comment'>-- &gt;                          (\r -&gt; [(u:^:v,w) |</span>
<a name="line-42"></a><span class='hs-comment'>-- &gt;                                  (u,s) &lt;- readsPrec (up_prec+1) r,</span>
<a name="line-43"></a><span class='hs-comment'>-- &gt;                                  (":^:",t) &lt;- lex s,</span>
<a name="line-44"></a><span class='hs-comment'>-- &gt;                                  (v,w) &lt;- readsPrec (up_prec+1) t]) r</span>
<a name="line-45"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-46"></a><span class='hs-comment'>-- &gt;           where app_prec = 10</span>
<a name="line-47"></a><span class='hs-comment'>-- &gt;                 up_prec = 5</span>
<a name="line-48"></a><span class='hs-comment'>--</span>
<a name="line-49"></a><span class='hs-comment'>-- Note that right-associativity of @:^:@ is unused.</span>
<a name="line-50"></a><span class='hs-comment'>--</span>
<a name="line-51"></a><span class='hs-comment'>-- The derived instance in GHC is equivalent to</span>
<a name="line-52"></a><span class='hs-comment'>--</span>
<a name="line-53"></a><span class='hs-comment'>-- &gt; instance (Read a) =&gt; Read (Tree a) where</span>
<a name="line-54"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-55"></a><span class='hs-comment'>-- &gt;         readPrec = parens $ (prec app_prec $ do</span>
<a name="line-56"></a><span class='hs-comment'>-- &gt;                                  Ident "Leaf" &lt;- lexP</span>
<a name="line-57"></a><span class='hs-comment'>-- &gt;                                  m &lt;- step readPrec</span>
<a name="line-58"></a><span class='hs-comment'>-- &gt;                                  return (Leaf m))</span>
<a name="line-59"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-60"></a><span class='hs-comment'>-- &gt;                      +++ (prec up_prec $ do</span>
<a name="line-61"></a><span class='hs-comment'>-- &gt;                                  u &lt;- step readPrec</span>
<a name="line-62"></a><span class='hs-comment'>-- &gt;                                  Symbol ":^:" &lt;- lexP</span>
<a name="line-63"></a><span class='hs-comment'>-- &gt;                                  v &lt;- step readPrec</span>
<a name="line-64"></a><span class='hs-comment'>-- &gt;                                  return (u :^: v))</span>
<a name="line-65"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-66"></a><span class='hs-comment'>-- &gt;           where app_prec = 10</span>
<a name="line-67"></a><span class='hs-comment'>-- &gt;                 up_prec = 5</span>
<a name="line-68"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-69"></a><span class='hs-comment'>-- &gt;         readListPrec = readListPrecDefault</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="Read"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-72"></a>  <span class='hs-comment'>-- | attempts to parse a value from the front of the string, returning</span>
<a name="line-73"></a>  <span class='hs-comment'>-- a list of (parsed value, remaining string) pairs.  If there is no</span>
<a name="line-74"></a>  <span class='hs-comment'>-- successful parse, the returned list is empty.</span>
<a name="line-75"></a>  <span class='hs-comment'>--</span>
<a name="line-76"></a>  <span class='hs-comment'>-- Derived instances of 'Read' and 'Text.Show.Show' satisfy the following:</span>
<a name="line-77"></a>  <span class='hs-comment'>--</span>
<a name="line-78"></a>  <span class='hs-comment'>-- * @(x,\"\")@ is an element of</span>
<a name="line-79"></a>  <span class='hs-comment'>--   @('readsPrec' d ('Text.Show.showsPrec' d x \"\"))@.</span>
<a name="line-80"></a>  <span class='hs-comment'>--</span>
<a name="line-81"></a>  <span class='hs-comment'>-- That is, 'readsPrec' parses the string produced by</span>
<a name="line-82"></a>  <span class='hs-comment'>-- 'Text.Show.showsPrec', and delivers the value that</span>
<a name="line-83"></a>  <span class='hs-comment'>-- 'Text.Show.showsPrec' started with.</span>
<a name="line-84"></a>
<a name="line-85"></a>  <span class='hs-varid'>readsPrec</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>   <span class='hs-comment'>-- ^ the operator precedence of the enclosing</span>
<a name="line-86"></a>                        <span class='hs-comment'>-- context (a number from @0@ to @11@).</span>
<a name="line-87"></a>                        <span class='hs-comment'>-- Function application has precedence @10@.</span>
<a name="line-88"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadS</span> <span class='hs-varid'>a</span>
<a name="line-89"></a>
<a name="line-90"></a>  <span class='hs-comment'>-- | The method 'readList' is provided to allow the programmer to</span>
<a name="line-91"></a>  <span class='hs-comment'>-- give a specialised way of parsing lists of values.</span>
<a name="line-92"></a>  <span class='hs-comment'>-- For example, this is used by the predefined 'Read' instance of</span>
<a name="line-93"></a>  <span class='hs-comment'>-- the 'Char' type, where values of type 'String' should be are</span>
<a name="line-94"></a>  <span class='hs-comment'>-- expected to use double quotes, rather than square brackets.</span>
<a name="line-95"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadS</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-96"></a>
<a name="line-97"></a>  <span class='hs-comment'>-- | Proposed replacement for 'readsPrec' using new-style parsers (GHC only).</span>
<a name="line-98"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-99"></a>
<a name="line-100"></a>  <span class='hs-comment'>-- | Proposed replacement for 'readList' using new-style parsers (GHC only).</span>
<a name="line-101"></a>  <span class='hs-comment'>-- The default definition uses 'readList'.  Instances that define 'readPrec'</span>
<a name="line-102"></a>  <span class='hs-comment'>-- should also define 'readListPrec' as 'readListPrecDefault'.</span>
<a name="line-103"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-104"></a>  
<a name="line-105"></a>  <span class='hs-comment'>-- default definitions</span>
<a name="line-106"></a>  <span class='hs-varid'>readsPrec</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readPrec_to_S</span> <span class='hs-varid'>readPrec</span>
<a name="line-107"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readPrec_to_S</span> <span class='hs-layout'>(</span><span class='hs-varid'>list</span> <span class='hs-varid'>readPrec</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span>
<a name="line-108"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readS_to_Prec</span> <span class='hs-varid'>readsPrec</span>
<a name="line-109"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readS_to_Prec</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>readList</span><span class='hs-layout'>)</span>
<a name="line-110"></a>
<a name="line-111"></a><a name="readListDefault"></a><span class='hs-definition'>readListDefault</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ReadS</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-112"></a><span class='hs-comment'>-- ^ A possible replacement definition for the 'readList' method (GHC only).</span>
<a name="line-113"></a><span class='hs-comment'>--   This is only needed for GHC, and even then only for 'Read' instances</span>
<a name="line-114"></a><span class='hs-comment'>--   where 'readListPrec' isn't defined as 'readListPrecDefault'.</span>
<a name="line-115"></a><span class='hs-definition'>readListDefault</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readPrec_to_S</span> <span class='hs-varid'>readListPrec</span> <span class='hs-num'>0</span>
<a name="line-116"></a>
<a name="line-117"></a><a name="readListPrecDefault"></a><span class='hs-definition'>readListPrecDefault</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-118"></a><span class='hs-comment'>-- ^ A possible replacement definition for the 'readListPrec' method,</span>
<a name="line-119"></a><span class='hs-comment'>--   defined using 'readPrec' (GHC only).</span>
<a name="line-120"></a><span class='hs-definition'>readListPrecDefault</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>list</span> <span class='hs-varid'>readPrec</span>
<a name="line-121"></a>
<a name="line-122"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-123"></a><span class='hs-comment'>-- H98 compatibility</span>
<a name="line-124"></a>
<a name="line-125"></a><a name="lex"></a><span class='hs-comment'>-- | The 'lex' function reads a single lexeme from the input, discarding</span>
<a name="line-126"></a><span class='hs-comment'>-- initial white space, and returning the characters that constitute the</span>
<a name="line-127"></a><span class='hs-comment'>-- lexeme.  If the input string contains only white space, 'lex' returns a</span>
<a name="line-128"></a><span class='hs-comment'>-- single successful \`lexeme\' consisting of the empty string.  (Thus</span>
<a name="line-129"></a><span class='hs-comment'>-- @'lex' \"\" = [(\"\",\"\")]@.)  If there is no legal lexeme at the</span>
<a name="line-130"></a><span class='hs-comment'>-- beginning of the input string, 'lex' fails (i.e. returns @[]@).</span>
<a name="line-131"></a><span class='hs-comment'>--</span>
<a name="line-132"></a><span class='hs-comment'>-- This lexer is not completely faithful to the Haskell lexical syntax</span>
<a name="line-133"></a><span class='hs-comment'>-- in the following respects:</span>
<a name="line-134"></a><span class='hs-comment'>--</span>
<a name="line-135"></a><span class='hs-comment'>-- * Qualified names are not handled properly</span>
<a name="line-136"></a><span class='hs-comment'>--</span>
<a name="line-137"></a><span class='hs-comment'>-- * Octal and hexadecimal numerics are not recognized as a single token</span>
<a name="line-138"></a><span class='hs-comment'>--</span>
<a name="line-139"></a><span class='hs-comment'>-- * Comments are not treated properly</span>
<a name="line-140"></a><span class='hs-definition'>lex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadS</span> <span class='hs-conid'>String</span>             <span class='hs-comment'>-- As defined by H98</span>
<a name="line-141"></a><span class='hs-definition'>lex</span> <span class='hs-varid'>s</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readP_to_S</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>hsLex</span> <span class='hs-varid'>s</span>
<a name="line-142"></a>
<a name="line-143"></a><a name="lexLitChar"></a><span class='hs-comment'>-- | Read a string representation of a character, using Haskell</span>
<a name="line-144"></a><span class='hs-comment'>-- source-language escape conventions.  For example:</span>
<a name="line-145"></a><span class='hs-comment'>--</span>
<a name="line-146"></a><span class='hs-comment'>-- &gt; lexLitChar  "\\nHello"  =  [("\\n", "Hello")]</span>
<a name="line-147"></a><span class='hs-comment'>--</span>
<a name="line-148"></a><span class='hs-definition'>lexLitChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadS</span> <span class='hs-conid'>String</span>      <span class='hs-comment'>-- As defined by H98</span>
<a name="line-149"></a><span class='hs-definition'>lexLitChar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readP_to_S</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>P</span><span class='hs-varop'>.</span><span class='hs-varid'>gather</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>lexChar</span> <span class='hs-layout'>;</span>
<a name="line-150"></a>                              <span class='hs-varid'>return</span> <span class='hs-varid'>s</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-151"></a>        <span class='hs-comment'>-- There was a skipSpaces before the P.gather L.lexChar,</span>
<a name="line-152"></a>        <span class='hs-comment'>-- but that seems inconsistent with readLitChar</span>
<a name="line-153"></a>
<a name="line-154"></a><a name="readLitChar"></a><span class='hs-comment'>-- | Read a string representation of a character, using Haskell</span>
<a name="line-155"></a><span class='hs-comment'>-- source-language escape conventions, and convert it to the character</span>
<a name="line-156"></a><span class='hs-comment'>-- that it encodes.  For example:</span>
<a name="line-157"></a><span class='hs-comment'>--</span>
<a name="line-158"></a><span class='hs-comment'>-- &gt; readLitChar "\\nHello"  =  [('\n', "Hello")]</span>
<a name="line-159"></a><span class='hs-comment'>--</span>
<a name="line-160"></a><span class='hs-definition'>readLitChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadS</span> <span class='hs-conid'>Char</span>       <span class='hs-comment'>-- As defined by H98</span>
<a name="line-161"></a><span class='hs-definition'>readLitChar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readP_to_S</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>lexChar</span>
<a name="line-162"></a>
<a name="line-163"></a><a name="lexDigits"></a><span class='hs-comment'>-- | Reads a non-empty string of decimal digits.</span>
<a name="line-164"></a><span class='hs-definition'>lexDigits</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadS</span> <span class='hs-conid'>String</span>
<a name="line-165"></a><span class='hs-definition'>lexDigits</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readP_to_S</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span><span class='hs-varop'>.</span><span class='hs-varid'>munch1</span> <span class='hs-varid'>isDigit</span><span class='hs-layout'>)</span>
<a name="line-166"></a>
<a name="line-167"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-168"></a><span class='hs-comment'>-- utility parsers</span>
<a name="line-169"></a>
<a name="line-170"></a><a name="lexP"></a><span class='hs-definition'>lexP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Lexeme</span>
<a name="line-171"></a><span class='hs-comment'>-- ^ Parse a single lexeme</span>
<a name="line-172"></a><span class='hs-definition'>lexP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>lex</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="paren"></a><span class='hs-definition'>paren</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-175"></a><span class='hs-comment'>-- ^ @(paren p)@ parses \"(P0)\"</span>
<a name="line-176"></a><span class='hs-comment'>--      where @p@ parses \"P0\" in precedence context zero</span>
<a name="line-177"></a><span class='hs-definition'>paren</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Punc</span> <span class='hs-str'>"("</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-178"></a>             <span class='hs-varid'>x</span>          <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reset</span> <span class='hs-varid'>p</span>
<a name="line-179"></a>             <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Punc</span> <span class='hs-str'>")"</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-180"></a>             <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="parens"></a><span class='hs-definition'>parens</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-183"></a><span class='hs-comment'>-- ^ @(parens p)@ parses \"P\", \"(P0)\", \"((P0))\", etc, </span>
<a name="line-184"></a><span class='hs-comment'>--      where @p@ parses \"P\"  in the current precedence context</span>
<a name="line-185"></a><span class='hs-comment'>--          and parses \"P0\" in precedence context zero</span>
<a name="line-186"></a><span class='hs-definition'>parens</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>optional</span>
<a name="line-187"></a> <span class='hs-keyword'>where</span>
<a name="line-188"></a>  <span class='hs-varid'>optional</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>mandatory</span>
<a name="line-189"></a>  <span class='hs-varid'>mandatory</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>paren</span> <span class='hs-varid'>optional</span>
<a name="line-190"></a>
<a name="line-191"></a><a name="list"></a><span class='hs-definition'>list</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-192"></a><span class='hs-comment'>-- ^ @(list p)@ parses a list of things parsed by @p@,</span>
<a name="line-193"></a><span class='hs-comment'>-- using the usual square-bracket syntax.</span>
<a name="line-194"></a><span class='hs-definition'>list</span> <span class='hs-varid'>readx</span> <span class='hs-keyglyph'>=</span>
<a name="line-195"></a>  <span class='hs-varid'>parens</span>
<a name="line-196"></a>  <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Punc</span> <span class='hs-str'>"["</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-197"></a>       <span class='hs-layout'>(</span><span class='hs-varid'>listRest</span> <span class='hs-conid'>False</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>listNext</span><span class='hs-layout'>)</span>
<a name="line-198"></a>  <span class='hs-layout'>)</span>
<a name="line-199"></a> <span class='hs-keyword'>where</span>
<a name="line-200"></a>  <span class='hs-varid'>listRest</span> <span class='hs-varid'>started</span> <span class='hs-keyglyph'>=</span>
<a name="line-201"></a>    <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Punc</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-202"></a>       <span class='hs-keyword'>case</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>of</span>
<a name="line-203"></a>         <span class='hs-str'>"]"</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-204"></a>         <span class='hs-str'>","</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>started</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>listNext</span>
<a name="line-205"></a>         <span class='hs-keyword'>_</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pfail</span>
<a name="line-206"></a>  
<a name="line-207"></a>  <span class='hs-varid'>listNext</span> <span class='hs-keyglyph'>=</span>
<a name="line-208"></a>    <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reset</span> <span class='hs-varid'>readx</span>
<a name="line-209"></a>       <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>listRest</span> <span class='hs-conid'>True</span>
<a name="line-210"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-211"></a>
<a name="line-212"></a><a name="choose"></a><span class='hs-definition'>choose</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-213"></a><span class='hs-comment'>-- ^ Parse the specified lexeme and continue as specified.</span>
<a name="line-214"></a><span class='hs-comment'>-- Esp useful for nullary constructors; e.g.</span>
<a name="line-215"></a><span class='hs-comment'>--    @choose [(\"A\", return A), (\"B\", return B)]@</span>
<a name="line-216"></a><span class='hs-comment'>-- We match both Ident and Symbol because the constructor</span>
<a name="line-217"></a><span class='hs-comment'>-- might be an operator eg (:=:)</span>
<a name="line-218"></a><span class='hs-definition'>choose</span> <span class='hs-varid'>sps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>+++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>try_one</span><span class='hs-layout'>)</span> <span class='hs-varid'>pfail</span> <span class='hs-varid'>sps</span>
<a name="line-219"></a>           <span class='hs-keyword'>where</span>
<a name="line-220"></a>             <span class='hs-varid'>try_one</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>token</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span> <span class='hs-layout'>;</span>
<a name="line-221"></a>                                  <span class='hs-keyword'>case</span> <span class='hs-varid'>token</span> <span class='hs-keyword'>of</span>
<a name="line-222"></a>                                    <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Ident</span> <span class='hs-varid'>s'</span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span><span class='hs-varop'>==</span><span class='hs-varid'>s'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>p</span>
<a name="line-223"></a>                                    <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Symbol</span> <span class='hs-varid'>s'</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span><span class='hs-varop'>==</span><span class='hs-varid'>s'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>p</span>
<a name="line-224"></a>                                    <span class='hs-sel'>_other</span>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pfail</span> <span class='hs-layout'>}</span>
</pre>\end{code}


%*********************************************************
%*                                                      *
\subsection{Simple instances of Read}
%*                                                      *
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Char</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-3"></a>    <span class='hs-varid'>parens</span>
<a name="line-4"></a>    <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-5"></a>         <span class='hs-varid'>return</span> <span class='hs-varid'>c</span>
<a name="line-6"></a>    <span class='hs-layout'>)</span>
<a name="line-7"></a>
<a name="line-8"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-9"></a>    <span class='hs-varid'>parens</span>
<a name="line-10"></a>    <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>     <span class='hs-comment'>-- Looks for "foo"</span>
<a name="line-11"></a>         <span class='hs-varid'>return</span> <span class='hs-varid'>s</span>
<a name="line-12"></a>     <span class='hs-varop'>+++</span>
<a name="line-13"></a>      <span class='hs-varid'>readListPrecDefault</span>       <span class='hs-comment'>-- Looks for ['f','o','o']</span>
<a name="line-14"></a>    <span class='hs-layout'>)</span>                           <span class='hs-comment'>-- (more generous than H98 spec)</span>
<a name="line-15"></a>
<a name="line-16"></a>  <span class='hs-varid'>readList</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>where</span>
<a name="line-19"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-20"></a>    <span class='hs-varid'>parens</span>
<a name="line-21"></a>    <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Ident</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-22"></a>         <span class='hs-keyword'>case</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-23"></a>           <span class='hs-str'>"True"</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-24"></a>           <span class='hs-str'>"False"</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-25"></a>           <span class='hs-keyword'>_</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pfail</span>
<a name="line-26"></a>    <span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-29"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Ordering</span> <span class='hs-keyword'>where</span>
<a name="line-32"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-33"></a>    <span class='hs-varid'>parens</span>
<a name="line-34"></a>    <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Ident</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-35"></a>         <span class='hs-keyword'>case</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-36"></a>           <span class='hs-str'>"LT"</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>LT</span>
<a name="line-37"></a>           <span class='hs-str'>"EQ"</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>EQ</span>
<a name="line-38"></a>           <span class='hs-str'>"GT"</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>GT</span>
<a name="line-39"></a>           <span class='hs-keyword'>_</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pfail</span>
<a name="line-40"></a>    <span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-43"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
</pre>\end{code}


%*********************************************************
%*                                                      *
\subsection{Structure instances of Read: Maybe, List etc}
%*                                                      *
%*********************************************************

For structured instances of Read we start using the precedences.  The
idea is then that 'parens (prec k p)' will fail immediately when trying
to parse it in a context with a higher precedence level than k. But if
there is one parenthesis parsed, then the required precedence level
drops to 0 again, and parsing inside p may succeed.

'appPrec' is just the precedence level of function application.  So,
if we are parsing function application, we'd better require the
precedence level to be at least 'appPrec'. Otherwise, we have to put
parentheses around it.

'step' is used to increase the precedence levels inside a
parser, and can be used to express left- or right- associativity. For
example, % is defined to be left associative, so we only increase
precedence on the right hand side.

Note how step is used in for example the Maybe parser to increase the
precedence beyond appPrec, so that basically only literals and
parenthesis-like objects such as (...) and [...] can be an argument to
'Just'.

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-3"></a>    <span class='hs-varid'>parens</span>
<a name="line-4"></a>    <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Ident</span> <span class='hs-str'>"Nothing"</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-5"></a>        <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-6"></a>     <span class='hs-varop'>+++</span>
<a name="line-7"></a>     <span class='hs-varid'>prec</span> <span class='hs-varid'>appPrec</span> <span class='hs-layout'>(</span>
<a name="line-8"></a>        <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Ident</span> <span class='hs-str'>"Just"</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-9"></a>           <span class='hs-varid'>x</span>              <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>step</span> <span class='hs-varid'>readPrec</span>
<a name="line-10"></a>           <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-11"></a>    <span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-14"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-15"></a>
<a name="line-16"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>where</span>
<a name="line-17"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrec</span>
<a name="line-18"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-19"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-keyword'>instance</span>  <span class='hs-layout'>(</span><span class='hs-conid'>Ix</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-conid'>Array</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>  <span class='hs-keyword'>where</span>
<a name="line-22"></a>    <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-varop'>$</span> <span class='hs-varid'>prec</span> <span class='hs-varid'>appPrec</span> <span class='hs-varop'>$</span>
<a name="line-23"></a>               <span class='hs-keyword'>do</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Ident</span> <span class='hs-str'>"array"</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-24"></a>                  <span class='hs-varid'>theBounds</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>step</span> <span class='hs-varid'>readPrec</span>
<a name="line-25"></a>                  <span class='hs-varid'>vals</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>step</span> <span class='hs-varid'>readPrec</span>
<a name="line-26"></a>                  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>array</span> <span class='hs-varid'>theBounds</span> <span class='hs-varid'>vals</span><span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a>    <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-29"></a>    <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Lexeme</span> <span class='hs-keyword'>where</span>
<a name="line-32"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lexP</span>
<a name="line-33"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-34"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
</pre>\end{code}


%*********************************************************
%*                                                      *
\subsection{Numeric instances of Read}
%*                                                      *
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><a name="readNumber"></a><span class='hs-definition'>readNumber</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Lexeme</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-2"></a><span class='hs-comment'>-- Read a signed number</span>
<a name="line-3"></a><span class='hs-definition'>readNumber</span> <span class='hs-varid'>convert</span> <span class='hs-keyglyph'>=</span>
<a name="line-4"></a>  <span class='hs-varid'>parens</span>
<a name="line-5"></a>  <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-6"></a>       <span class='hs-keyword'>case</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span>
<a name="line-7"></a>         <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Symbol</span> <span class='hs-str'>"-"</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-8"></a>                            <span class='hs-varid'>n</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>convert</span> <span class='hs-varid'>y</span>
<a name="line-9"></a>                            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>negate</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a>         <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>convert</span> <span class='hs-varid'>x</span>
<a name="line-12"></a>  <span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a>
<a name="line-15"></a><a name="convertInt"></a><span class='hs-definition'>convertInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Lexeme</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-16"></a><span class='hs-definition'>convertInt</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-17"></a><span class='hs-definition'>convertInt</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pfail</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="convertFrac"></a><span class='hs-definition'>convertFrac</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fractional</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Lexeme</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-20"></a><span class='hs-definition'>convertFrac</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-definition'>convertFrac</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Rat</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromRational</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>convertFrac</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pfail</span>
<a name="line-23"></a>
<a name="line-24"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>where</span>
<a name="line-25"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readNumber</span> <span class='hs-varid'>convertInt</span>
<a name="line-26"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-27"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-28"></a>
<a name="line-29"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Integer</span> <span class='hs-keyword'>where</span>
<a name="line-30"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readNumber</span> <span class='hs-varid'>convertInt</span>
<a name="line-31"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-32"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-33"></a>
<a name="line-34"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Float</span> <span class='hs-keyword'>where</span>
<a name="line-35"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readNumber</span> <span class='hs-varid'>convertFrac</span>
<a name="line-36"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-37"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Double</span> <span class='hs-keyword'>where</span>
<a name="line-40"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readNumber</span> <span class='hs-varid'>convertFrac</span>
<a name="line-41"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-42"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-43"></a>
<a name="line-44"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ratio</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-45"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-46"></a>    <span class='hs-varid'>parens</span>
<a name="line-47"></a>    <span class='hs-layout'>(</span> <span class='hs-varid'>prec</span> <span class='hs-varid'>ratioPrec</span>
<a name="line-48"></a>      <span class='hs-layout'>(</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span>            <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>step</span> <span class='hs-varid'>readPrec</span>
<a name="line-49"></a>           <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Symbol</span> <span class='hs-str'>"%"</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-50"></a>           <span class='hs-varid'>y</span>            <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>step</span> <span class='hs-varid'>readPrec</span>
<a name="line-51"></a>           <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>%</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-52"></a>      <span class='hs-layout'>)</span>
<a name="line-53"></a>    <span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-56"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
</pre>\end{code}


%*********************************************************
%*                                                      *
        Tuple instances of Read, up to size 15
%*                                                      *
%*********************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>()</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span>
<a name="line-3"></a>    <span class='hs-varid'>parens</span>
<a name="line-4"></a>    <span class='hs-layout'>(</span> <span class='hs-varid'>paren</span>
<a name="line-5"></a>      <span class='hs-layout'>(</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-6"></a>      <span class='hs-layout'>)</span>
<a name="line-7"></a>    <span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-10"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-13"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-varid'>read_tup2</span>
<a name="line-14"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-15"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="wrap_tup"></a><span class='hs-definition'>wrap_tup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-varid'>a</span>
<a name="line-18"></a><span class='hs-definition'>wrap_tup</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>paren</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="read_comma"></a><span class='hs-definition'>read_comma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-conid'>()</span>
<a name="line-21"></a><span class='hs-definition'>read_comma</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Punc</span> <span class='hs-str'>","</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lexP</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span> <span class='hs-layout'>}</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="read_tup2"></a><span class='hs-definition'>read_tup2</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-comment'>-- Reads "a , b"  no parens!</span>
<a name="line-25"></a><span class='hs-definition'>read_tup2</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-26"></a>               <span class='hs-varid'>read_comma</span>
<a name="line-27"></a>               <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-28"></a>               <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="read_tup4"></a><span class='hs-definition'>read_tup4</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-definition'>read_tup4</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>  <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span>
<a name="line-32"></a>                <span class='hs-varid'>read_comma</span>
<a name="line-33"></a>                <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span>
<a name="line-34"></a>                <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-35"></a>
<a name="line-36"></a>
<a name="line-37"></a><a name="read_tup8"></a><span class='hs-definition'>read_tup8</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-38"></a>          <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ReadPrec</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-definition'>read_tup8</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>  <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span>
<a name="line-40"></a>                <span class='hs-varid'>read_comma</span>
<a name="line-41"></a>                <span class='hs-layout'>(</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span>
<a name="line-42"></a>                <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-43"></a>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-46"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span> 
<a name="line-47"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span> 
<a name="line-48"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-49"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-50"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-51"></a>
<a name="line-52"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-53"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-varid'>read_tup4</span>
<a name="line-54"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-55"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-58"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-59"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-60"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-61"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-62"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-65"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-66"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-67"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span>
<a name="line-68"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-69"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-70"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-71"></a>
<a name="line-72"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span>
<a name="line-73"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-74"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-75"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-76"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>g</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-77"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-78"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-79"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-80"></a>
<a name="line-81"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-82"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-83"></a>  <span class='hs-varid'>readPrec</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-varid'>read_tup8</span>
<a name="line-84"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-85"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-86"></a>
<a name="line-87"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-88"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-89"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-90"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-91"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-92"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-93"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-94"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-95"></a>
<a name="line-96"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-97"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span>
<a name="line-98"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-99"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-100"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span>
<a name="line-101"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-102"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-103"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-104"></a>
<a name="line-105"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-106"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-107"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-108"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-109"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-110"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-111"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-112"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-113"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-114"></a>
<a name="line-115"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-116"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-117"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-118"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-119"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span>
<a name="line-120"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-121"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-122"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-123"></a>
<a name="line-124"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-125"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-126"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-127"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-128"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-129"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-130"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-131"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-132"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-133"></a>
<a name="line-134"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-135"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-136"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-137"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-138"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-139"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span>
<a name="line-140"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-141"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-142"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
<a name="line-143"></a>
<a name="line-144"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span>
<a name="line-145"></a>          <span class='hs-conid'>Read</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span>
<a name="line-146"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>g</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>,</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-147"></a>  <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap_tup</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup8</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-148"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup4</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-149"></a>                          <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>read_tup2</span><span class='hs-layout'>;</span> <span class='hs-varid'>read_comma</span>
<a name="line-150"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readPrec</span>
<a name="line-151"></a>                          <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-varid'>g</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span><span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-152"></a>  <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span>
<a name="line-153"></a>  <span class='hs-varid'>readList</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListDefault</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- XXX Can this be removed?</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="readp"></a><span class='hs-definition'>readp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>a</span>
<a name="line-4"></a><span class='hs-definition'>readp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readPrec_to_P</span> <span class='hs-varid'>readPrec</span> <span class='hs-varid'>minPrec</span>
</pre>\end{code}

</body>
</html>