[project @ 2004-06-23 22:43:20 by ross]
[ghc-hetmet.git] / ghc / docs / users_guide / glasgow_exts.sgml
index baf9ef7..30de1d2 100644 (file)
@@ -2,17 +2,19 @@
 <indexterm><primary>language, GHC</primary></indexterm>
 <indexterm><primary>extensions, GHC</primary></indexterm>
 As with all known Haskell systems, GHC implements some extensions to
-the language.  To use them, you'll need to give a <option>-fglasgow-exts</option>
-<indexterm><primary>-fglasgow-exts option</primary></indexterm> option.
+the language.  They are all enabled by options; by default GHC
+understands only plain Haskell 98.
 </para>
 
 <para>
-Virtually all of the Glasgow extensions serve to give you access to
-the underlying facilities with which we implement Haskell.  Thus, you
-can get at the Raw Iron, if you are willing to write some non-standard
-code at a more primitive level.  You need not be &ldquo;stuck&rdquo; on
-performance because of the implementation costs of Haskell's
-&ldquo;high-level&rdquo; features&mdash;you can always code &ldquo;under&rdquo; them.  In an extreme case, you can write all your time-critical code in C, and then just glue it together with Haskell!
+Some of the Glasgow extensions serve to give you access to the
+underlying facilities with which we implement Haskell.  Thus, you can
+get at the Raw Iron, if you are willing to write some non-portable
+code at a more primitive level.  You need not be &ldquo;stuck&rdquo;
+on performance because of the implementation costs of Haskell's
+&ldquo;high-level&rdquo; features&mdash;you can always code
+&ldquo;under&rdquo; them.  In an extreme case, you can write all your
+time-critical code in C, and then just glue it together with Haskell!
 </para>
 
 <para>
@@ -20,8 +22,8 @@ Before you get too carried away working at the lowest level (e.g.,
 sloshing <literal>MutableByteArray&num;</literal>s around your
 program), you may wish to check if there are libraries that provide a
 &ldquo;Haskellised veneer&rdquo; over the features you want.  The
-separate libraries documentation describes all the libraries that come
-with GHC.
+separate <ulink url="../libraries/index.html">libraries
+documentation</ulink> describes all the libraries that come with GHC.
 </para>
 
 <!-- LANGUAGE OPTIONS -->
@@ -35,10 +37,38 @@ with GHC.
     <indexterm><primary>extensions</primary><secondary>options controlling</secondary>
     </indexterm>
 
-    <para> These flags control what variation of the language are
+    <para>These flags control what variation of the language are
     permitted.  Leaving out all of them gives you standard Haskell
     98.</para>
 
+    <para>NB. turning on an option that enables special syntax
+    <emphasis>might</emphasis> cause working Haskell 98 code to fail
+    to compile, perhaps because it uses a variable name which has
+    become a reserved word.  So, together with each option below, we
+    list the special syntax which is enabled by this option.  We use
+    notation and nonterminal names from the Haskell 98 lexical syntax
+    (see the Haskell 98 Report).  There are two classes of special
+    syntax:</para>
+
+    <itemizedlist>
+      <listitem>
+       <para>New reserved words and symbols: character sequences
+        which are no longer available for use as identifiers in the
+        program.</para>
+      </listitem>
+      <listitem>
+       <para>Other special syntax: sequences of characters that have
+       a different meaning when this particular option is turned
+       on.</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>We are only listing syntax changes here that might affect
+    existing working programs (i.e. "stolen" syntax).  Many of these
+    extensions will also enable new context-free syntax, but in all
+    cases programs written to use the new syntax would not be
+    compilable without the option enabled.</para>
+
     <variablelist>
 
       <varlistentry>
@@ -49,6 +79,19 @@ with GHC.
           Haskell 98 described in <xref
           linkend="ghc-language-features">, except where otherwise
           noted. </para>
+
+         <para>New reserved words: <literal>forall</literal> (only in
+         types), <literal>mdo</literal>.</para>
+
+         <para>Other syntax stolen:
+             <replaceable>varid</replaceable>{<literal>&num;</literal>},
+             <replaceable>char</replaceable><literal>&num;</literal>,      
+             <replaceable>string</replaceable><literal>&num;</literal>,    
+             <replaceable>integer</replaceable><literal>&num;</literal>,    
+             <replaceable>float</replaceable><literal>&num;</literal>,    
+             <replaceable>float</replaceable><literal>&num;&num;</literal>,    
+             <literal>(&num;</literal>, <literal>&num;)</literal>,         
+             <literal>|)</literal>, <literal>{|</literal>.</para>
        </listitem>
       </varlistentry>
 
@@ -61,6 +104,8 @@ with GHC.
          Haskell 98 Foreign Function Interface Addendum plus deprecated
          syntax of previous versions of the FFI for backwards
          compatibility.</para> 
+
+         <para>New reserved words: <literal>foreign</literal>.</para>
        </listitem>
       </varlistentry>
 
@@ -103,6 +148,14 @@ with GHC.
        <listitem>
          <para>See <xref LinkEnd="arrow-notation">.  Independent of
           <option>-fglasgow-exts</option>.</para>
+
+         <para>New reserved words/symbols: <literal>rec</literal>,
+         <literal>proc</literal>, <literal>-&lt;</literal>,
+         <literal>&gt;-</literal>, <literal>-&lt;&lt;</literal>,
+         <literal>&gt;&gt;-</literal>.</para>
+
+         <para>Other syntax stolen: <literal>(|</literal>,
+         <literal>|)</literal>.</para>
        </listitem>
       </varlistentry>
 
@@ -149,6 +202,12 @@ with GHC.
          <para>Enables Template Haskell (see <xref
          linkend="template-haskell">).  Currently also implied by
          <option>-fglasgow-exts</option>.</para>
+
+         <para>Syntax stolen: <literal>[|</literal>,
+         <literal>[e|</literal>, <literal>[p|</literal>,
+         <literal>[d|</literal>, <literal>[t|</literal>,
+         <literal>$(</literal>,
+         <literal>$<replaceable>varid</replaceable></literal>.</para>
        </listitem>
       </varlistentry>
 
@@ -158,6 +217,10 @@ with GHC.
          <para>Enables implicit parameters (see <xref
          linkend="implicit-parameters">).  Currently also implied by 
          <option>-fglasgow-exts</option>.</para>
+
+         <para>Syntax stolen:
+         <literal>?<replaceable>varid</replaceable></literal>,
+         <literal>%<replaceable>varid</replaceable></literal>.</para>
        </listitem>
       </varlistentry>
 
@@ -1468,12 +1531,12 @@ in GHC, you can give the foralls if you want.  See <xref LinkEnd="universal-quan
  <emphasis>Each universally quantified type variable
 <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. 
+A type variable <literal>a</literal> is "reachable" if it it appears
+in the same constraint as either a type variable free in in
+<literal>type</literal>, or another reachable type variable.  
+A value with a type that does not obey 
+this reachability restriction cannot be used without introducing
+ambiguity; that is why the type is rejected.
 Here, for example, is an illegal type:
 
 
@@ -1488,7 +1551,23 @@ would be introduced where <literal>tv</literal> is a fresh type variable, and
 applied to a dictionary for <literal>Eq tv</literal>.  The difficulty is that we
 can never know which instance of <literal>Eq</literal> to use because we never
 get any more information about <literal>tv</literal>.
-
+</para>
+<para>
+Note
+that the reachability condition is weaker than saying that <literal>a</literal> is
+functionally dependendent on a type variable free in
+<literal>type</literal> (see <xref
+linkend="functional-dependencies">).  The reason for this is there
+might be a "hidden" dependency, in a superclass perhaps.  So
+"reachable" is a conservative approximation to "functionally dependent".
+For example, consider:
+<programlisting>
+  class C a b | a -> b where ...
+  class C a b => D a b where ...
+  f :: forall a b. D a b => a -> a
+</programlisting>
+This is fine, because in fact <literal>a</literal> does functionally determine <literal>b</literal>
+but that is not immediately apparent from <literal>f</literal>'s type.
 </para>
 </listitem>
 <listitem>
@@ -3316,7 +3395,7 @@ module Printf where
 -- you intend to use it.
 
 -- Import some Template Haskell syntax
-import Language.Haskell.THSyntax
+import Language.Haskell.TH.Syntax
 
 -- Describe a format string
 data Format = D | S | L String
@@ -3400,35 +3479,50 @@ What follows is a brief introduction to the notation;
 it won't make much sense unless you've read Hughes's paper.
 This notation is translated to ordinary Haskell,
 using combinators from the
-<ulink url="../base/Control.Arrow.html"><literal>Control.Arrow</literal></ulink>
+<ulink url="../libraries/base/Control.Arrow.html"><literal>Control.Arrow</literal></ulink>
 module.
 </para>
 
-<para>The extension adds a new kind of expression for defining arrows,
-of the form <literal>proc pat -> cmd</literal>,
+<para>The extension adds a new kind of expression for defining arrows:
+<screen>
+<replaceable>exp</replaceable><superscript>10</superscript> ::= ...
+       |  proc <replaceable>apat</replaceable> -> <replaceable>cmd</replaceable>
+</screen>
 where <literal>proc</literal> is a new keyword.
 The variables of the pattern are bound in the body of the 
 <literal>proc</literal>-expression,
 which is a new sort of thing called a <firstterm>command</firstterm>.
 The syntax of commands is as follows:
 <screen>
-cmd   ::= exp1 -&lt;  exp2
-       |  exp1 -&lt;&lt; exp2
-       |  do { cstmt1 .. cstmtn ; cmd }
-       |  let decls in cmd
-       |  if exp then cmd1 else cmd2
-       |  case exp of { calts }
-       |  cmd1 qop cmd2
-       |  (| aexp cmd1 .. cmdn |)
-       |  \ pat1 .. patn -> cmd
-       |  cmd aexp
-       |  ( cmd )
-
-cstmt ::= let decls
-       |  pat &lt;- cmd
-       |  rec { cstmt1 .. cstmtn }
-       |  cmd
+<replaceable>cmd</replaceable>   ::= <replaceable>exp</replaceable><superscript>10</superscript> -&lt;  <replaceable>exp</replaceable>
+       |  <replaceable>exp</replaceable><superscript>10</superscript> -&lt;&lt; <replaceable>exp</replaceable>
+       |  <replaceable>cmd</replaceable><superscript>0</superscript>
+</screen>
+with <replaceable>cmd</replaceable><superscript>0</superscript> up to
+<replaceable>cmd</replaceable><superscript>9</superscript> defined using
+infix operators as for expressions, and
+<screen>
+<replaceable>cmd</replaceable><superscript>10</superscript> ::= \ <replaceable>apat</replaceable> ... <replaceable>apat</replaceable> -> <replaceable>cmd</replaceable>
+       |  let <replaceable>decls</replaceable> in <replaceable>cmd</replaceable>
+       |  if <replaceable>exp</replaceable> then <replaceable>cmd</replaceable> else <replaceable>cmd</replaceable>
+       |  case <replaceable>exp</replaceable> of { <replaceable>calts</replaceable> }
+       |  do { <replaceable>cstmt</replaceable> ; ... <replaceable>cstmt</replaceable> ; <replaceable>cmd</replaceable> }
+       |  <replaceable>fcmd</replaceable>
+
+<replaceable>fcmd</replaceable>  ::= <replaceable>fcmd</replaceable> <replaceable>aexp</replaceable>
+       |  ( <replaceable>cmd</replaceable> )
+       |  (| <replaceable>aexp</replaceable> <replaceable>cmd</replaceable> ... <replaceable>cmd</replaceable> |)
+
+<replaceable>cstmt</replaceable> ::= let <replaceable>decls</replaceable>
+       |  <replaceable>pat</replaceable> &lt;- <replaceable>cmd</replaceable>
+       |  rec { <replaceable>cstmt</replaceable> ; ... <replaceable>cstmt</replaceable> [;] }
+       |  <replaceable>cmd</replaceable>
 </screen>
+where <replaceable>calts</replaceable> are like <replaceable>alts</replaceable>
+except that the bodies are commands instead of expressions.
+</para>
+
+<para>
 Commands produce values, but (like monadic computations)
 may yield more than one value,
 or none, and may do other things as well.
@@ -3613,7 +3707,7 @@ ArrowChoice a => (&lt;+>) :: a e c -> a e c -> a e c
 </programlisting>
 so we can use it to build commands:
 <programlisting>
-expr' = proc x ->
+expr' = proc x -> do
                 returnA -&lt; x
         &lt;+> do
                 symbol Plus -&lt; ()
@@ -3624,6 +3718,9 @@ expr' = proc x ->
                 y &lt;- term -&lt; ()
                 expr' -&lt; x - y
 </programlisting>
+(The <literal>do</literal> on the first line is needed to prevent the first
+<literal>&lt;+> ...</literal> from being interpreted as part of the
+expression on the previous line.)
 This is equivalent to
 <programlisting>
 expr' = (proc x -> returnA -&lt; x)
@@ -4206,40 +4303,20 @@ hammeredLookup :: Ord key => [(key, value)] -> key -> value
       <para>A <literal>SPECIALIZE</literal> pragma for a function can
       be put anywhere its type signature could be put.</para>
 
-<para>A <literal>SPECIALIZE</literal> has the effect of generating (a) a specialised
-version of the function and (b) a rewrite rule (see <xref linkend="rules">) that 
-rewrites a call to the un-specialised function into a call to the specialised
-one. You can, instead, provide your own specialised function and your own rewrite rule.
-For example, suppose that:
-<programlisting>
-  genericLookup :: Ord a => Table a b   -> a   -> b
-  intLookup     ::          Table Int b -> Int -> b
-</programlisting>
-where <literal>intLookup</literal> is an implementation of <literal>genericLookup</literal>
-that works very fast for keys of type <literal>Int</literal>.  Then you can write the rule
-<programlisting>
-  {-# RULES "intLookup" genericLookup = intLookup #-}
-</programlisting>
-(see <xref linkend="rule-spec">). It is <emphasis>Your
-      Responsibility</emphasis> to make sure that
-      <function>intLookup</function> really behaves as a specialised
-      version of <function>genericLookup</function>!!!</para>
+      <para>A <literal>SPECIALIZE</literal> has the effect of generating
+      (a) a specialised version of the function and (b) a rewrite rule
+      (see <xref linkend="rewrite-rules">) that rewrites a call to the
+      un-specialised function into a call to the specialised one.</para>
 
-      <para>An example in which using <literal>RULES</literal> for
-      specialisation will Win Big:
+      <para>In earlier versions of GHC, it was possible to provide your own
+      specialised function for a given type:
 
 <programlisting>
-  toDouble :: Real a => a -> Double
-  toDouble = fromRational . toRational
-
-  {-# RULES "toDouble/Int" toDouble = i2d #-}
-  i2d (I# i) = D# (int2Double# i) -- uses Glasgow prim-op directly
+{-# SPECIALIZE hammeredLookup :: [(Int, value)] -> Int -> value = intLookup #-}
 </programlisting>
 
-      The <function>i2d</function> function is virtually one machine
-      instruction; the default conversion&mdash;via an intermediate
-      <literal>Rational</literal>&mdash;is obscenely expensive by
-      comparison.</para>
+      This feature has been removed, as it is now subsumed by the
+      <literal>RULES</literal> pragma (see <xref linkend="rule-spec">).</para>
 
     </sect2>
 
@@ -4825,43 +4902,62 @@ Prelude definitions of the above functions to see how to do so.
 
 <para>
 Rewrite rules can be used to get the same effect as a feature
-present in earlier version of GHC:
+present in earlier versions of GHC.
+For example, suppose that:
 
 <programlisting>
-  {-# SPECIALIZE fromIntegral :: Int8 -> Int16 = int8ToInt16 #-}
+genericLookup :: Ord a => Table a b   -> a   -> b
+intLookup     ::          Table Int b -> Int -> b
 </programlisting>
 
-This told GHC to use <function>int8ToInt16</function> instead of <function>fromIntegral</function> whenever
-the latter was called with type <literal>Int8 -&gt; Int16</literal>.  That is, rather than
-specialising the original definition of <function>fromIntegral</function> the programmer is
-promising that it is safe to use <function>int8ToInt16</function> instead.
-</para>
-
-<para>
-This feature is no longer in GHC.  But rewrite rules let you do the
-same thing:
+where <function>intLookup</function> is an implementation of
+<function>genericLookup</function> that works very fast for
+keys of type <literal>Int</literal>.  You might wish
+to tell GHC to use <function>intLookup</function> instead of
+<function>genericLookup</function> whenever the latter was called with
+type <literal>Table Int b -&gt; Int -&gt; b</literal>.
+It used to be possible to write
 
 <programlisting>
-{-# RULES
-  "fromIntegral/Int8/Int16" fromIntegral = int8ToInt16
-#-}
+{-# SPECIALIZE genericLookup :: Table Int b -> Int -> b = intLookup #-}
 </programlisting>
 
-This slightly odd-looking rule instructs GHC to replace <function>fromIntegral</function>
-by <function>int8ToInt16</function> <emphasis>whenever the types match</emphasis>.  Speaking more operationally,
-GHC adds the type and dictionary applications to get the typed rule
+This feature is no longer in GHC, but rewrite rules let you do the same thing:
 
 <programlisting>
-forall (d1::Integral Int8) (d2::Num Int16) .
-        fromIntegral Int8 Int16 d1 d2 = int8ToInt16
+{-# RULES "genericLookup/Int" genericLookup = intLookup #-}
 </programlisting>
 
-What is more,
-this rule does not need to be in the same file as fromIntegral,
-unlike the <literal>SPECIALISE</literal> pragmas which currently do (so that they
+This slightly odd-looking rule instructs GHC to replace
+<function>genericLookup</function> by <function>intLookup</function>
+<emphasis>whenever the types match</emphasis>.
+What is more, this rule does not need to be in the same
+file as <function>genericLookup</function>, unlike the
+<literal>SPECIALIZE</literal> pragmas which currently do (so that they
 have an original definition available to specialise).
 </para>
 
+<para>It is <emphasis>Your Responsibility</emphasis> to make sure that
+<function>intLookup</function> really behaves as a specialised version
+of <function>genericLookup</function>!!!</para>
+
+<para>An example in which using <literal>RULES</literal> for
+specialisation will Win Big:
+
+<programlisting>
+toDouble :: Real a => a -> Double
+toDouble = fromRational . toRational
+
+{-# RULES "toDouble/Int" toDouble = i2d #-}
+i2d (I# i) = D# (int2Double# i) -- uses Glasgow prim-op directly
+</programlisting>
+
+The <function>i2d</function> function is virtually one machine
+instruction; the default conversion&mdash;via an intermediate
+<literal>Rational</literal>&mdash;is obscenely expensive by
+comparison.
+</para>
+
 </sect2>
 
 <sect2>