[project @ 2003-06-13 08:45:32 by simonmar]
[ghc-hetmet.git] / ghc / docs / users_guide / glasgow_exts.sgml
index ba1d697..b43f6d4 100644 (file)
@@ -635,32 +635,6 @@ This name is not supported by GHC.
 </sect2>
 
 
-<sect2> <title> Infix type constructors </title>
-
-<para>GHC supports infix type constructors, much as it supports infix data constructors.  For example:
-<programlisting>
-  infixl 5 :+:
-
-  data a :+: b = Inl a | Inr b
-
-  f :: a `Either` b -> a :+: b
-  f (Left x) = Inl x
-</programlisting>
-</para>
-<para>The lexical 
-syntax of an infix type constructor is just like that of an infix data constructor: either
-it's an operator beginning with ":", or it is an ordinary (alphabetic) type constructor enclosed in
-back-quotes.</para>
-
-<para>
-When you give a fixity declaration, the fixity applies to both the data constructor and the
-type constructor with the specified name.  You cannot give different fixities to the type constructor T
-and the data constructor T.
-</para>
-
-
-</sect2>
-
    <!-- ===================== PARALLEL LIST COMPREHENSIONS ===================  -->
 
   <sect2 id="parallel-list-comprehensions">
@@ -959,38 +933,19 @@ classes: exploring the design space</ULink > (Simon Peyton Jones, Mark
 Jones, Erik Meijer).
 </para>
 
-<para>
-I'd like to thank people who reported shorcomings in the GHC 3.02
-implementation.  Our default decisions were all conservative ones, and
-the experience of these heroic pioneers has given useful concrete
-examples to support several generalisations.  (These appear below as
-design choices not implemented in 3.02.)
-</para>
-
-<para>
-I've discussed these notes with Mark Jones, and I believe that Hugs
-will migrate towards the same design choices as I outline here.
-Thanks to him, and to many others who have offered very useful
-feedback.
-</para>
 
-<sect3>
+<sect3 id="type-restrictions">
 <title>Types</title>
 
 <para>
-There are the following restrictions on the form of a qualified
-type:
-</para>
-
-<para>
+GHC imposes the following restrictions on the form of a qualified
+type, whether declared in a type signature
+or inferred. Consider the type:
 
 <programlisting>
   forall tv1..tvn (c1, ...,cn) => type
 </programlisting>
 
-</para>
-
-<para>
 (Here, I write the "foralls" explicitly, although the Haskell source
 language omits them; in Haskell 1.4, all the free type variables of an
 explicit source-language type signature are universally quantified,
@@ -1005,11 +960,15 @@ in GHC, you can give the foralls if you want.  See <xref LinkEnd="universal-quan
 
 <para>
  <emphasis>Each universally quantified type variable
-<literal>tvi</literal> must be mentioned (i.e. appear free) in <literal>type</literal></emphasis>.
+<literal>tvi</literal> must be reachable from <literal>type</literal></emphasis>.
 
+A type variable is "reachable" if it it is functionally dependent
+(see <xref linkend="functional-dependencies">)
+on the type variables free in <literal>type</literal>.
 The reason for this is that a value with a type that does not obey
 this restriction could not be used without introducing
-ambiguity. Here, for example, is an illegal type:
+ambiguity. 
+Here, for example, is an illegal type:
 
 
 <programlisting>
@@ -1064,10 +1023,6 @@ territory free in case we need it later.
 
 </para>
 
-<para>
-These restrictions apply to all types, whether declared in a type signature
-or inferred.
-</para>
 
 <para>
 Unlike Haskell 1.4, constraints in types do <emphasis>not</emphasis> have to be of
@@ -1154,56 +1109,14 @@ be acyclic</emphasis>.  So these class declarations are OK:
 
 </para>
 </listitem>
-<listitem>
-
-<para>
- <emphasis>In the signature of a class operation, every constraint
-must mention at least one type variable that is not a class type
-variable</emphasis>.
-
-Thus:
-
-
-<programlisting>
-  class Collection c a where
-    mapC :: Collection c b => (a->b) -> c a -> c b
-</programlisting>
-
 
-is OK because the constraint <literal>(Collection a b)</literal> mentions
-<literal>b</literal>, even though it also mentions the class variable
-<literal>a</literal>.  On the other hand:
-
-
-<programlisting>
-  class C a where
-    op :: Eq a => (a,b) -> (a,b)
-</programlisting>
-
-
-is not OK because the constraint <literal>(Eq a)</literal> mentions on the class
-type variable <literal>a</literal>, but not <literal>b</literal>.  However, any such
-example is easily fixed by moving the offending context up to the
-superclass context:
-
-
-<programlisting>
-  class Eq a => C a where
-    op ::(a,b) -> (a,b)
-</programlisting>
-
-
-A yet more relaxed rule would allow the context of a class-op signature
-to mention only class type variables.  However, that conflicts with
-Rule 1(b) for types above.
-
-</para>
-</listitem>
 <listitem>
 
 <para>
- <emphasis>The type of each class operation must mention <emphasis>all</emphasis> of
-the class type variables</emphasis>.  For example:
+ <emphasis>All of the class type variables must be reachable (in the sense 
+mentioned in <xref linkend="type-restrictions">)
+from the free varibles of each method type
+</emphasis>.  For example:
 
 
 <programlisting>
@@ -1379,63 +1292,8 @@ For example, this is OK:
   instance Stateful (ST s) (MutVar s) where ...
 </programlisting>
 
-
-The "at least one not a type variable" restriction is to ensure that
-context reduction terminates: each reduction step removes one type
-constructor.  For example, the following would make the type checker
-loop if it wasn't excluded:
-
-
-<programlisting>
-  instance C a => C a where ...
-</programlisting>
-
-
-There are two situations in which the rule is a bit of a pain. First,
-if one allows overlapping instance declarations then it's quite
-convenient to have a "default instance" declaration that applies if
-something more specific does not:
-
-
-<programlisting>
-  instance C a where
-    op = ... -- Default
-</programlisting>
-
-
-Second, sometimes you might want to use the following to get the
-effect of a "class synonym":
-
-
-<programlisting>
-  class (C1 a, C2 a, C3 a) => C a where { }
-
-  instance (C1 a, C2 a, C3 a) => C a where { }
-</programlisting>
-
-
-This allows you to write shorter signatures:
-
-
-<programlisting>
-  f :: C a => ...
-</programlisting>
-
-
-instead of
-
-
-<programlisting>
-  f :: (C1 a, C2 a, C3 a) => ...
-</programlisting>
-
-
-I'm on the lookout for a simple rule that preserves decidability while
-allowing these idioms.  The experimental flag
-<option>-fallow-undecidable-instances</option><indexterm><primary>-fallow-undecidable-instances
-option</primary></indexterm> lifts this restriction, allowing all the types in an
-instance head to be type variables.
-
+See <xref linkend="undecidable-instances"> for an experimental
+extension to lift this restriction.
 </para>
 </listitem>
 <listitem>
@@ -1497,16 +1355,10 @@ instance C Int b => Foo b where ...
 </programlisting>
 
 
-is not OK.  Again, the intent here is to make sure that context
-reduction terminates.
+is not OK.  See <xref linkend="undecidable-instances"> for an experimental
+extension to lift this restriction.
+
 
-Voluminous correspondence on the Haskell mailing list has convinced me
-that it's worth experimenting with a more liberal rule.  If you use
-the flag <option>-fallow-undecidable-instances</option> can use arbitrary
-types in an instance context.  Termination is ensured by having a
-fixed-depth recursion stack.  If you exceed the stack depth you get a
-sort of backtrace, and the opportunity to increase the stack depth
-with <option>-fcontext-stack</option><emphasis>N</emphasis>.
 
 </para>
 </listitem>
@@ -1519,6 +1371,80 @@ with <option>-fcontext-stack</option><emphasis>N</emphasis>.
 
 </sect2>
 
+<sect2 id="undecidable-instances">
+<title>Undecidable instances</title>
+
+<para>The rules for instance declarations state that:
+<itemizedlist>
+<listitem><para>At least one of the types in the <emphasis>head</emphasis> of
+an instance declaration <emphasis>must not</emphasis> be a type variable.
+</para></listitem>
+<listitem><para>All of the types in the <emphasis>context</emphasis> of
+an instance declaration <emphasis>must</emphasis> be type variables.
+</para></listitem>
+</itemizedlist>
+These restrictions ensure that 
+context reduction terminates: each reduction step removes one type
+constructor.  For example, the following would make the type checker
+loop if it wasn't excluded:
+<programlisting>
+  instance C a => C a where ...
+</programlisting>
+There are two situations in which the rule is a bit of a pain. First,
+if one allows overlapping instance declarations then it's quite
+convenient to have a "default instance" declaration that applies if
+something more specific does not:
+
+
+<programlisting>
+  instance C a where
+    op = ... -- Default
+</programlisting>
+
+
+Second, sometimes you might want to use the following to get the
+effect of a "class synonym":
+
+
+<programlisting>
+  class (C1 a, C2 a, C3 a) => C a where { }
+
+  instance (C1 a, C2 a, C3 a) => C a where { }
+</programlisting>
+
+
+This allows you to write shorter signatures:
+
+
+<programlisting>
+  f :: C a => ...
+</programlisting>
+
+
+instead of
+
+
+<programlisting>
+  f :: (C1 a, C2 a, C3 a) => ...
+</programlisting>
+
+
+Voluminous correspondence on the Haskell mailing list has convinced me
+that it's worth experimenting with more liberal rules.  If you use
+the experimental flag <option>-fallow-undecidable-instances</option>
+<indexterm><primary>-fallow-undecidable-instances
+option</primary></indexterm>, you can use arbitrary
+types in both an instance context and instance head.  Termination is ensured by having a
+fixed-depth recursion stack.  If you exceed the stack depth you get a
+sort of backtrace, and the opportunity to increase the stack depth
+with <option>-fcontext-stack</option><emphasis>N</emphasis>.
+</para>
+<para>
+I'm on the lookout for a less brutal solution: a simple rule that preserves decidability while
+allowing these idioms interesting idioms.  
+</para>
+</sect2>
+
 <sect2 id="implicit-parameters">
 <title>Implicit parameters
 </title>
@@ -1860,8 +1786,14 @@ In Proceedings of the 9th European Symposium on Programming,
 ESOP 2000, Berlin, Germany, March 2000, Springer-Verlag LNCS 1782,
 .
 </para>
-
 <para>
+Functional dependencies are introduced by a vertical bar in the syntax of a 
+class declaration;  e.g. 
+<programlisting>
+  class (Monad m) => MonadState s m | m -> s where ...
+
+  class Foo a b c | a b -> c where ...
+</programlisting>
 There should be more documentation, but there isn't (yet).  Yell if you need it.
 </para>
 </sect2>
@@ -3516,24 +3448,64 @@ Assertion failures can be caught, see the documentation for the
     unrecognised <replaceable>word</replaceable> is (silently)
     ignored.</para>
 
-<sect2 id="inline-pragma">
-<title>INLINE pragma
+    <sect2 id="deprecated-pragma">
+      <title>DEPRECATED pragma</title>
+      <indexterm><primary>DEPRECATED</primary>
+      </indexterm>
 
-<indexterm><primary>INLINE and NOINLINE pragmas</primary></indexterm>
-<indexterm><primary>pragma, INLINE</primary></indexterm></title>
+      <para>The DEPRECATED pragma lets you specify that a particular
+      function, class, or type, is deprecated.  There are two
+      forms.</para>
 
-<para>
-GHC (with <option>-O</option>, as always) tries to inline (or &ldquo;unfold&rdquo;)
-functions/values that are &ldquo;small enough,&rdquo; thus avoiding the call
-overhead and possibly exposing other more-wonderful optimisations.
-Normally, if GHC decides a function is &ldquo;too expensive&rdquo; to inline, it
-will not do so, nor will it export that unfolding for other modules to
-use.
-</para>
+      <itemizedlist>
+       <listitem>
+         <para>You can deprecate an entire module thus:</para>
+<programlisting>
+   module Wibble {-# DEPRECATED "Use Wobble instead" #-} where
+     ...
+</programlisting>
+         <para>When you compile any module that import
+          <literal>Wibble</literal>, GHC will print the specified
+          message.</para>
+       </listitem>
 
-<para>
-The sledgehammer you can bring to bear is the
-<literal>INLINE</literal><indexterm><primary>INLINE pragma</primary></indexterm> pragma, used thusly:
+       <listitem>
+         <para>You can deprecate a function, class, or type, with the
+         following top-level declaration:</para>
+<programlisting>
+   {-# DEPRECATED f, C, T "Don't use these" #-}
+</programlisting>
+         <para>When you compile any module that imports and uses any
+          of the specifed entities, GHC will print the specified
+          message.</para>
+       </listitem>
+      </itemizedlist>
+
+      <para>You can suppress the warnings with the flag
+      <option>-fno-warn-deprecations</option>.</para>
+    </sect2>
+
+    <sect2 id="inline-noinline-pragma">
+      <title>INLINE and NOINLINE pragmas</title>
+
+      <para>These pragmas control the inlining of function
+      definitions.</para>
+
+      <sect3 id="inline-pragma">
+       <title>INLINE pragma</title>
+       <indexterm><primary>INLINE</primary></indexterm>
+
+       <para>GHC (with <option>-O</option>, as always) tries to
+        inline (or &ldquo;unfold&rdquo;) functions/values that are
+        &ldquo;small enough,&rdquo; thus avoiding the call overhead
+        and possibly exposing other more-wonderful optimisations.
+        Normally, if GHC decides a function is &ldquo;too
+        expensive&rdquo; to inline, it will not do so, nor will it
+        export that unfolding for other modules to use.</para>
+
+        <para>The sledgehammer you can bring to bear is the
+        <literal>INLINE</literal><indexterm><primary>INLINE
+        pragma</primary></indexterm> pragma, used thusly:</para>
 
 <programlisting>
 key_function :: Int -> String -> (Bool, Double)
@@ -3542,25 +3514,26 @@ key_function :: Int -> String -> (Bool, Double)
 {-# INLINE key_function #-}
 #endif
 </programlisting>
-(You don't need to do the C pre-processor carry-on unless you're going
-to stick the code through HBC&mdash;it doesn't like <literal>INLINE</literal> pragmas.)
-</para>
 
-<para>
-The major effect of an <literal>INLINE</literal> pragma is to declare a function's
-&ldquo;cost&rdquo; to be very low.  The normal unfolding machinery will then be
-very keen to inline it.
-</para>
+       <para>(You don't need to do the C pre-processor carry-on
+        unless you're going to stick the code through HBC&mdash;it
+        doesn't like <literal>INLINE</literal> pragmas.)</para>
 
-<para>
-Syntactially, an <literal>INLINE</literal> pragma for a function can be put anywhere its type
-signature could be put.
-</para>
+        <para>The major effect of an <literal>INLINE</literal> pragma
+        is to declare a function's &ldquo;cost&rdquo; to be very low.
+        The normal unfolding machinery will then be very keen to
+        inline it.</para>
 
-<para>
-<literal>INLINE</literal> pragmas are a particularly good idea for the
-<literal>then</literal>/<literal>return</literal> (or <literal>bind</literal>/<literal>unit</literal>) functions in a monad.
-For example, in GHC's own <literal>UniqueSupply</literal> monad code, we have:
+       <para>Syntactially, an <literal>INLINE</literal> pragma for a
+        function can be put anywhere its type signature could be
+        put.</para>
+
+       <para><literal>INLINE</literal> pragmas are a particularly
+        good idea for the
+        <literal>then</literal>/<literal>return</literal> (or
+        <literal>bind</literal>/<literal>unit</literal>) functions in
+        a monad.  For example, in GHC's own
+        <literal>UniqueSupply</literal> monad code, we have:</para>
 
 <programlisting>
 #ifdef __GLASGOW_HASKELL__
@@ -3569,95 +3542,140 @@ For example, in GHC's own <literal>UniqueSupply</literal> monad code, we have:
 #endif
 </programlisting>
 
-</para>
-
-<sect3 id="noinline-pragma">
-<title>The NOINLINE pragma </title>
+       <para>See also the <literal>NOINLINE</literal> pragma (<xref
+        linkend="noinline-pragma">).</para>
+      </sect3>
+
+      <sect3 id="noinline-pragma">
+       <title>NOINLINE pragma</title>
+       
+       <indexterm><primary>NOINLINE</primary></indexterm>
+       <indexterm><primary>NOTINLINE</primary></indexterm>
+
+       <para>The <literal>NOINLINE</literal> pragma does exactly what
+        you'd expect: it stops the named function from being inlined
+        by the compiler.  You shouldn't ever need to do this, unless
+        you're very cautious about code size.</para>
+
+       <para><literal>NOTINLINE</literal> is a synonym for
+        <literal>NOINLINE</literal> (<literal>NOTINLINE</literal> is
+        specified by Haskell 98 as the standard way to disable
+        inlining, so it should be used if you want your code to be
+        portable).</para>
+      </sect3>
+
+      <sect3 id="phase-control">
+       <title>Phase control</title>
+
+       <para> Sometimes you want to control exactly when in GHC's
+        pipeline the INLINE pragma is switched on.  Inlining happens
+        only during runs of the <emphasis>simplifier</emphasis>.  Each
+        run of the simplifier has a different <emphasis>phase
+        number</emphasis>; the phase number decreases towards zero.
+        If you use <option>-dverbose-core2core</option> you'll see the
+        sequence of phase numbers for successive runs of the
+        simpifier.  In an INLINE pragma you can optionally specify a
+        phase number, thus:</para>
 
-<indexterm><primary>NOINLINE pragma</primary></indexterm>
-<indexterm><primary>pragma</primary><secondary>NOINLINE</secondary></indexterm>
-<indexterm><primary>NOTINLINE pragma</primary></indexterm>
-<indexterm><primary>pragma</primary><secondary>NOTINLINE</secondary></indexterm>
-
-<para>
-The <literal>NOINLINE</literal> pragma does exactly what you'd expect:
-it stops the named function from being inlined by the compiler.  You
-shouldn't ever need to do this, unless you're very cautious about code
-size.
-</para>
-
-<para><literal>NOTINLINE</literal> is a synonym for
-<literal>NOINLINE</literal> (<literal>NOTINLINE</literal> is specified
-by Haskell 98 as the standard way to disable inlining, so it should be
-used if you want your code to be portable).</para>
-</sect3>
-
-
-<sect3 id="phase-control">
-<title>Phase control</title>
-
-<para> Sometimes you want to control exactly when in GHC's pipeline
-the INLINE pragma is switched on.  Inlining happens only during runs of
-the <emphasis>simplifier</emphasis>.  Each run of the simplifier has a different
-<emphasis>phase number</emphasis>; the phase number decreases towards zero.
-If you use <option>-dverbose-core2core</option>
-you'll see the sequence of phase numbers for successive runs of the simpifier.
-In an INLINE pragma you can optionally specify a phase number, thus:
-<itemizedlist>
-<listitem> <para>You can say "inline <literal>f</literal> in Phase 2 and all subsequent
-phases":
+       <itemizedlist>
+         <listitem>
+           <para>You can say "inline <literal>f</literal> in Phase 2
+            and all subsequent phases":
 <programlisting>
   {-# INLINE [2] f #-}
 </programlisting>
-</para></listitem>
+            </para>
+         </listitem>
 
-<listitem> <para>You can say "inline <literal>g</literal> in all phases up to, but
-not including, Phase 3":
+         <listitem>
+           <para>You can say "inline <literal>g</literal> in all
+            phases up to, but not including, Phase 3":
 <programlisting>
   {-# INLINE [~3] g #-}
 </programlisting>
-</para></listitem>
+            </para>
+         </listitem>
 
-<listitem> <para>If you omit the phase indicator, you mean "inline in all phases".
-</para></listitem>
-</itemizedlist>
-You can use a phase number on a NOINLINE pragma too:
-<itemizedlist>
-<listitem> <para>You can say "do not inline <literal>f</literal> until Phase 2; in 
-Phase 2 and subsequently behave as if there was no pragma at all":
+         <listitem>
+           <para>If you omit the phase indicator, you mean "inline in
+            all phases".</para>
+         </listitem>
+       </itemizedlist>
+
+       <para>You can use a phase number on a NOINLINE pragma too:</para>
+
+       <itemizedlist>
+         <listitem>
+           <para>You can say "do not inline <literal>f</literal>
+            until Phase 2; in Phase 2 and subsequently behave as if
+            there was no pragma at all":
 <programlisting>
   {-# NOINLINE [2] f #-}
 </programlisting>
-</para></listitem>
+            </para>
+         </listitem>
 
-<listitem> <para>You can say "do not inline <literal>g</literal> in Phase 3 or any subsequent phase; 
-before that, behave as if there was no pragma":
+         <listitem>
+           <para>You can say "do not inline <literal>g</literal> in
+            Phase 3 or any subsequent phase; before that, behave as if
+            there was no pragma":
 <programlisting>
   {-# NOINLINE [~3] g #-}
 </programlisting>
-</para></listitem>
+            </para>
+         </listitem>
 
-<listitem> <para>If you omit the phase indicator, you mean "never inline this function".
-</para></listitem>
-</itemizedlist>
-</para>
-<para>The same phase-numbering control is available for RULES (<xref LinkEnd="rewrite-rules">).</para>
-</sect3>
+         <listitem>
+           <para>If you omit the phase indicator, you mean "never
+            inline this function".</para>
+         </listitem>
+       </itemizedlist>
+
+       <para>The same phase-numbering control is available for RULES
+       (<xref LinkEnd="rewrite-rules">).</para>
+      </sect3>
+    </sect2>
 
+    <sect2 id="line-pragma">
+      <title>LINE pragma</title>
 
+      <indexterm><primary>LINE</primary><secondary>pragma</secondary></indexterm>
+      <indexterm><primary>pragma</primary><secondary>LINE</secondary></indexterm>
+      <para>This pragma is similar to C's <literal>&num;line</literal>
+      pragma, and is mainly for use in automatically generated Haskell
+      code.  It lets you specify the line number and filename of the
+      original code; for example</para>
 
-</sect2>
+<programlisting>
+{-# LINE 42 "Foo.vhs" #-}
+</programlisting>
 
-<sect2 id="rules">
-<title>RULES pragma</title>
+      <para>if you'd generated the current file from something called
+      <filename>Foo.vhs</filename> and this line corresponds to line
+      42 in the original.  GHC will adjust its error messages to refer
+      to the line/file named in the <literal>LINE</literal>
+      pragma.</para>
+    </sect2>
 
-<para>
-The RULES pragma lets you specify rewrite rules.  It is described in
-<xref LinkEnd="rewrite-rules">.
-</para>
+    <sect2 id="options-pragma">
+      <title>OPTIONS pragma</title>
+      <indexterm><primary>OPTIONS</primary>
+      </indexterm>
+      <indexterm><primary>pragma</primary><secondary>OPTIONS</secondary>
+      </indexterm>
+
+      <para>The <literal>OPTIONS</literal> pragma is used to specify
+      additional options that are given to the compiler when compiling
+      this source file.  See <xref linkend="source-file-options"> for
+      details.</para>
+    </sect2>
 
-</sect2>
+    <sect2 id="rules">
+      <title>RULES pragma</title>
 
+      <para>The RULES pragma lets you specify rewrite rules.  It is
+      described in <xref LinkEnd="rewrite-rules">.</para>
+    </sect2>
 
     <sect2 id="specialize-pragma">
       <title>SPECIALIZE pragma</title>
@@ -3749,73 +3767,7 @@ of the pragma.
 
 </sect2>
 
-<sect2 id="line-pragma">
-<title>LINE pragma
-</title>
-
-<para>
-<indexterm><primary>LINE pragma</primary></indexterm>
-<indexterm><primary>pragma, LINE</primary></indexterm>
-</para>
 
-<para>
-This pragma is similar to C's <literal>&num;line</literal> pragma, and is mainly for use in
-automatically generated Haskell code.  It lets you specify the line
-number and filename of the original code; for example
-</para>
-
-<para>
-
-<programlisting>
-{-# LINE 42 "Foo.vhs" #-}
-</programlisting>
-
-</para>
-
-<para>
-if you'd generated the current file from something called <filename>Foo.vhs</filename>
-and this line corresponds to line 42 in the original.  GHC will adjust
-its error messages to refer to the line/file named in the <literal>LINE</literal>
-pragma.
-</para>
-
-</sect2>
-
-<sect2 id="deprecated-pragma">
-<title>DEPRECATED pragma</title>
-
-<para>
-The DEPRECATED pragma lets you specify that a particular function, class, or type, is deprecated.  
-There are two forms.  
-</para>
-<itemizedlist>
-<listitem><para>
-You can deprecate an entire module thus:</para>
-<programlisting>
-   module Wibble {-# DEPRECATED "Use Wobble instead" #-} where
-     ...
-</programlisting>
-<para>
-When you compile any module that import <literal>Wibble</literal>, GHC will print
-the specified message.</para>
-</listitem>
-
-<listitem>
-<para>
-You can deprecate a function, class, or type, with the following top-level declaration:
-</para>
-<programlisting>
-   {-# DEPRECATED f, C, T "Don't use these" #-}
-</programlisting>
-<para>
-When you compile any module that imports and uses any of the specifed entities, 
-GHC will print the specified message.
-</para>
-</listitem>
-</itemizedlist>
-<para>You can suppress the warnings with the flag <option>-fno-warn-deprecations</option>.</para>
-
-</sect2>
 
 </sect1>
 
@@ -4366,7 +4318,7 @@ If you add <option>-dppr-debug</option> you get a more detailed listing.
 <listitem>
 
 <para>
- The defintion of (say) <function>build</function> in <FileName>PrelBase.lhs</FileName> looks llike this:
+ The defintion of (say) <function>build</function> in <FileName>GHC/Base.lhs</FileName> looks llike this:
 
 <programlisting>
         build   :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
@@ -4384,9 +4336,9 @@ in the RHS of the <literal>INLINE</literal> thing.  I regret the delicacy of thi
 <listitem>
 
 <para>
- In <filename>ghc/lib/std/PrelBase.lhs</filename> look at the rules for <function>map</function> to
+ In <filename>libraries/base/GHC/Base.lhs</filename> look at the rules for <function>map</function> to
 see how to write rules that will do fusion and yet give an efficient
-program even if fusion doesn't happen.  More rules in <filename>PrelList.lhs</filename>.
+program even if fusion doesn't happen.  More rules in <filename>GHC/List.lhs</filename>.
 </para>
 </listitem>
 
@@ -4433,7 +4385,7 @@ g x = show x
   f :: %forall a . GHCziShow.ZCTShow a ->
                    a -> GHCziBase.ZMZN GHCziBase.Char =
     \ @ a (zddShow::GHCziShow.ZCTShow a) (eta::a) ->
-        (%note "hello"
+        (%note "foo"
          %case zddShow %of (tpl::GHCziShow.ZCTShow a)
            {GHCziShow.ZCDShow
             (tpl1::GHCziBase.Int ->
@@ -4507,7 +4459,7 @@ Now you can make a data type into an instance of Bin like this:
   instance (Bin a, Bin b) => Bin (a,b)
   instance Bin a => Bin [a]
 </programlisting>
-That is, just leave off the "where" clasuse.  Of course, you can put in the
+That is, just leave off the "where" clause.  Of course, you can put in the
 where clause and over-ride whichever methods you please.
 </para>