remove unused primitives.xml
[ghc-hetmet.git] / docs / users_guide / glasgow_exts.xml
index 29e7082..4ed8c2a 100644 (file)
@@ -241,6 +241,14 @@ documentation</ulink> describes all the libraries that come with GHC.
       </varlistentry>
 
       <varlistentry>
+       <term><option>-foverloaded-strings</option></term>
+       <listitem>
+         <para>Enables overloaded string literals (see <xref
+         linkend="overloaded-strings"/>).</para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
        <term><option>-fscoped-type-variables</option></term>
        <listitem>
          <para>Enables lexically-scoped type variables (see <xref
@@ -269,8 +277,6 @@ documentation</ulink> describes all the libraries that come with GHC.
   </sect1>
 
 <!-- UNBOXED TYPES AND PRIMITIVE OPERATIONS -->
-<!--    included from primitives.sgml  -->
-<!-- &primitives; -->
 <sect1 id="primitives">
   <title>Unboxed types and primitive operations</title>
 
@@ -544,14 +550,11 @@ import qualified Control.Monad.ST.Strict as ST
       linkend="search-path"/>.</para>
 
       <para>GHC comes with a large collection of libraries arranged
-      hierarchically; see the accompanying library documentation.
-      There is an ongoing project to create and maintain a stable set
-      of <quote>core</quote> libraries used by several Haskell
-      compilers, and the libraries that GHC comes with represent the
-      current status of that project.  For more details, see <ulink
-      url="http://www.haskell.org/~simonmar/libraries/libraries.html">Haskell
-      Libraries</ulink>.</para>
-
+      hierarchically; see the accompanying <ulink
+      url="../libraries/index.html">library
+      documentation</ulink>.  More libraries to install are available
+      from <ulink
+      url="http://hackage.haskell.org/packages/hackage.html">HackageDB</ulink>.</para>
     </sect2>
 
     <!-- ====================== PATTERN GUARDS =======================  -->
@@ -620,7 +623,7 @@ to write clunky would be to use case expressions:
 </para>
 
 <programlisting>
-clunky env var1 var1 = case lookup env var1 of
+clunky env var1 var2 = case lookup env var1 of
   Nothing -&gt; fail
   Just val1 -&gt; case lookup env var2 of
     Nothing -&gt; fail
@@ -645,7 +648,7 @@ Here is how I would write clunky:
 </para>
 
 <programlisting>
-clunky env var1 var1
+clunky env var1 var2
   | Just val1 &lt;- lookup env var1
   , Just val2 &lt;- lookup env var2
   = val1 + val2
@@ -956,7 +959,7 @@ a data type with no constructors.  For example:</para>
 <para>Syntactically, the declaration lacks the "= constrs" part.  The 
 type can be parameterised over types of any kind, but if the kind is
 not <literal>*</literal> then an explicit kind annotation must be used
-(see <xref linkend="sec-kinding"/>).</para>
+(see <xref linkend="kinding"/>).</para>
 
 <para>Such data types have only one value, namely bottom.
 Nevertheless, they can be useful when defining "phantom types".</para>
@@ -1218,7 +1221,7 @@ that collection of packages in a uniform manner.  You can express
 quite a bit of object-oriented-like programming this way.
 </para>
 
-<sect4 id="existential">
+<sect3 id="existential">
 <title>Why existential?
 </title>
 
@@ -1241,9 +1244,9 @@ But Haskell programmers can safely think of the ordinary
 adding a new existential quantification construct.
 </para>
 
-</sect4>
+</sect3>
 
-<sect4>
+<sect3>
 <title>Type classes</title>
 
 <para>
@@ -1303,9 +1306,9 @@ Notice the way that the syntax fits smoothly with that used for
 universal quantification earlier.
 </para>
 
-</sect4>
+</sect3>
 
-<sect4 id="existential-records">
+<sect3 id="existential-records">
 <title>Record Constructors</title>
 
 <para>
@@ -1322,7 +1325,7 @@ data Counter a = forall self. NewCounter
 Here <literal>tag</literal> is a public field, with a well-typed selector
 function <literal>tag :: Counter a -> a</literal>.  The <literal>self</literal>
 type is hidden from the outside; any attempt to apply <literal>_this</literal>,
-<literal>_inc</literal> or <literal>_output</literal> as functions will raise a
+<literal>_inc</literal> or <literal>_display</literal> as functions will raise a
 compile-time error.  In other words, <emphasis>GHC defines a record selector function
 only for fields whose type does not mention the existentially-quantified variables</emphasis>.
 (This example used an underscore in the fields for which record selectors
@@ -1368,10 +1371,10 @@ setTag obj t = obj{ tag = t }
 
 </para>
 
-</sect4>
+</sect3>
 
 
-<sect4>
+<sect3>
 <title>Restrictions</title>
 
 <para>
@@ -1522,7 +1525,7 @@ declarations.  Define your own instances!
 
 </para>
 
-</sect4>
+</sect3>
 </sect2>
 
 <!-- ====================== Generalised algebraic data types =======================  -->
@@ -2069,7 +2072,7 @@ the standard method is used or the one described here.)
 <title>Stand-alone deriving declarations</title>
 
 <para>
-GHC now allows stand-alone <literal>deriving</literal> declarations:
+GHC now allows stand-alone <literal>deriving</literal> declarations, enabled by <literal>-fglasgow-exts</literal>:
 <programlisting>
   data Foo a = Bar a | Baz String
 
@@ -2538,7 +2541,7 @@ the context and head of the instance declaration can each consist of arbitrary
 following rules:
 <orderedlist>
 <listitem><para>
-For each assertion in the context:
+The Paterson Conditions: for each assertion in the context
 <orderedlist>
 <listitem><para>No type variable has more occurrences in the assertion than in the head</para></listitem>
 <listitem><para>The assertion has fewer constructors and variables (taken together
@@ -2546,7 +2549,7 @@ For each assertion in the context:
 </orderedlist>
 </para></listitem>
 
-<listitem><para>The coverage condition.  For each functional dependency,
+<listitem><para>The Coverage Condition.  For each functional dependency,
 <replaceable>tvs</replaceable><subscript>left</subscript> <literal>-&gt;</literal>
 <replaceable>tvs</replaceable><subscript>right</subscript>,  of the class,
 every type variable in
@@ -2558,11 +2561,15 @@ corresponding type in the instance declaration.
 </orderedlist>
 These restrictions ensure that context reduction terminates: each reduction
 step makes the problem smaller by at least one
-constructor.  For example, the following would make the type checker
-loop if it wasn't excluded:
-<programlisting>
-  instance C a => C a where ...
-</programlisting>
+constructor.  Both the Paterson Conditions and the Coverage Condition are lifted 
+if you give the <option>-fallow-undecidable-instances</option> 
+flag (<xref linkend="undecidable-instances"/>).
+You can find lots of background material about the reason for these
+restrictions in the paper <ulink
+url="http://research.microsoft.com/%7Esimonpj/papers/fd%2Dchr/">
+Understanding functional dependencies via Constraint Handling Rules</ulink>.
+</para>
+<para>
 For example, these are OK:
 <programlisting>
   instance C Int [a]          -- Multiple parameters
@@ -2614,11 +2621,6 @@ something more specific does not:
     op = ... -- Default
 </programlisting>
 </para>
-<para>You can find lots of background material about the reason for these
-restrictions in the paper <ulink
-url="http://research.microsoft.com/%7Esimonpj/papers/fd%2Dchr/">
-Understanding functional dependencies via Constraint Handling Rules</ulink>.
-</para>
 </sect3>
 
 <sect3 id="undecidable-instances">
@@ -2683,8 +2685,8 @@ makes instance inference go into a loop, because it requires the constraint
 Nevertheless, GHC allows you to experiment 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
+option</primary></indexterm>, both the Paterson Conditions and the Coverage Condition
+(described in <xref linkend="instance-rules"/>) are lifted.  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>.
@@ -3364,7 +3366,7 @@ and you'd be right.  That is why they are an experimental feature.
 
 ================ END OF Linear Implicit Parameters commented out -->
 
-<sect2 id="sec-kinding">
+<sect2 id="kinding">
 <title>Explicitly-kinded quantification</title>
 
 <para>
@@ -3484,7 +3486,6 @@ including an operational type class context, is legal:
 <itemizedlist>
 <listitem> <para> On the left or right (see <literal>f4</literal>, for example)
 of a function arrow </para> </listitem>
-<listitem> <para> On the right of a function arrow (see <xref linkend="hoist"/>) </para> </listitem>
 <listitem> <para> As the argument of a constructor, or type of a field, in a data type declaration. For
 example, any of the <literal>f1,f2,f3,g1,g2</literal> above would be valid
 field type signatures.</para> </listitem>
@@ -4056,6 +4057,81 @@ pattern binding must have the same context.  For example, this is fine:
 </para>
 </sect2>
 
+<sect2 id="overloaded-strings">
+<title>Overloaded string literals
+</title>
+
+<para>
+GHC supports <emphasis>overloaded string literals</emphasis>.  Normally a
+string literal has type <literal>String</literal>, but with overloaded string
+literals enabled (with <literal>-foverloaded-strings</literal>)
+ a string literal has type <literal>(IsString a) => a</literal>.
+</para>
+<para>
+This means that the usual string syntax can be used, e.g., for packed strings
+and other variations of string like types.  String literals behave very much
+like integer literals, i.e., they can be used in both expressions and patterns.
+If used in a pattern the literal with be replaced by an equality test, in the same
+way as an integer literal is.
+</para>
+<para>
+The class <literal>IsString</literal> is defined as:
+<programlisting>
+class IsString a where
+    fromString :: String -> a
+</programlisting>
+The only predefined instance is the obvious one to make strings work as usual:
+<programlisting>
+instance IsString [Char] where
+    fromString cs = cs
+</programlisting>
+The class <literal>IsString</literal> is not in scope by default.  If you want to mention
+it explicitly (for exmaple, to give an instance declaration for it), you can import it
+from module <literal>GHC.Exts</literal>.
+</para>
+<para>
+Haskell's defaulting mechanism is extended to cover string literals, when <option>-foverloaded-strings</option> is specified.
+Specifically:
+<itemizedlist>
+<listitem><para>
+Each type in a default declaration must be an 
+instance of <literal>Num</literal> <emphasis>or</emphasis> of <literal>IsString</literal>.
+</para></listitem>
+
+<listitem><para>
+The standard defaulting rule (<ulink url="http://haskell.org/onlinereport/decls.html#sect4.3.4">Haskell Report, Section 4.3.4</ulink>)
+is extended thus: defaulting applies when all the unresolved constraints involve standard classes
+<emphasis>or</emphasis> <literal>IsString</literal>; and at least one is a numeric class
+<emphasis>or</emphasis> <literal>IsString</literal>.
+</para></listitem>
+</itemizedlist>
+</para>
+<para>
+A small example:
+<programlisting>
+module Main where
+
+import GHC.Exts( IsString(..) )
+
+newtype MyString = MyString String deriving (Eq, Show)
+instance IsString MyString where
+    fromString = MyString
+
+greet :: MyString -> MyString
+greet "hello" = "world"
+greet other = other
+
+main = do
+    print $ greet "hello"
+    print $ greet "fool"
+</programlisting>
+</para>
+<para>
+Note that deriving <literal>Eq</literal> is necessary for the pattern matching
+to work since it gets translated into an equality comparison.
+</para>
+</sect2>
+
 </sect1>
 <!-- ==================== End of type system extensions =================  -->
   
@@ -4167,6 +4243,14 @@ Tim Sheard is going to expand it.)
            (It would make sense to do so, but it's hard to implement.)
    </para></listitem>
 
+   <listitem><para>
+   Furthermore, you can only run a function at compile time if it is imported
+   from another module <emphasis>that is not part of a mutually-recursive group of modules
+   that includes the module currently being compiled</emphasis>.  For example, when compiling module A,
+   you can only run Template Haskell functions imported from B if B does not import A (directly or indirectly).
+   The reason should be clear: to run B we must compile and run A, but we are currently type-checking A.
+   </para></listitem>
+
     <listitem><para>
            The flag <literal>-ddump-splices</literal> shows the expansion of all top-level splices as they happen.
    </para></listitem>
@@ -4786,7 +4870,7 @@ Because the preprocessor targets Haskell (rather than Core),
 
 <!-- ==================== BANG PATTERNS =================  -->
 
-<sect1 id="sec-bang-patterns">
+<sect1 id="bang-patterns">
 <title>Bang patterns
 <indexterm><primary>Bang patterns</primary></indexterm>
 </title>
@@ -4801,7 +4885,7 @@ than the material below.
 Bang patterns are enabled by the flag <option>-fbang-patterns</option>.
 </para>
 
-<sect2 id="sec-bang-patterns-informal">
+<sect2 id="bang-patterns-informal">
 <title>Informal description of bang patterns
 </title>
 <para>
@@ -4856,7 +4940,7 @@ is part of the syntax of <literal>let</literal> bindings.
 </sect2>
 
 
-<sect2 id="sec-bang-patterns-sem">
+<sect2 id="bang-patterns-sem">
 <title>Syntax and semantics
 </title>
 <para>
@@ -4930,7 +5014,7 @@ a module.
 
 <!-- ==================== ASSERTIONS =================  -->
 
-<sect1 id="sec-assertions">
+<sect1 id="assertions">
 <title>Assertions
 <indexterm><primary>Assertions</primary></indexterm>
 </title>
@@ -5899,12 +5983,6 @@ The following are good consumers:
 <listitem>
 
 <para>
- <function>length</function>
-</para>
-</listitem>
-<listitem>
-
-<para>
  <function>++</function> (on its first argument)
 </para>
 </listitem>