:show bindings show the current bindings made at the prompt
:type <expr> show the type of <expr>
+ :kind <type> show the kind of <type>
:undef <cmd> undefine user-defined command :<cmd>
:unset <option> ... unset options
:quit exit GHCi
indicate that the current context for expressions typed at the
prompt is the <literal>Main</literal> module we just loaded (we'll
explain what the <literal>*</literal> means later in <xref
- linkend="ghci-scope">). So we can now type expressions involving
+ linkend="ghci-scope"/>). So we can now type expressions involving
the functions from <filename>Main.hs</filename>:</para>
<screen>
<para>or it can be set using the <literal>:set</literal> command
from within GHCi (see <xref
- linkend="ghci-cmd-line-options">)<footnote><para>Note that in
+ linkend="ghci-cmd-line-options"/>)<footnote><para>Note that in
GHCi, and <option>––make</option> mode, the <option>-i</option>
option is used to specify the search path for
<emphasis>source</emphasis> files, whereas in standard
batch-compilation mode the <option>-i</option> option is used to
specify the search path for interface files, see <xref
- linkend="options-finding-imports">.</para> </footnote></para>
+ linkend="search-path"/>.</para> </footnote></para>
<para>One consequence of the way that GHCi follows dependencies
to find modules to load is that every module must have a source
doing its best to avoid actually recompiling modules if their
external dependencies haven't changed. This is the same
mechanism we use to avoid re-compiling modules in the batch
- compilation setting (see <xref linkend="recomp">).</para>
+ compilation setting (see <xref linkend="recomp"/>).</para>
</sect2>
</sect1>
use one in preference to interpreting the source if possible. For
example, suppose we have a 4-module program consisting of modules
A, B, C, and D. Modules B and C both import D only,
- and A imports both B & C:</para>
+ and A imports both B & C:</para>
<screen>
A
/ \
<para>Here's an example:</para>
<screen>
-Prelude> x <- return 42
+Prelude> x <- return 42
Prelude> print x
42
Prelude>
</screen>
- <para>The statement <literal>x <- return 42</literal> means
+ <para>The statement <literal>x <- return 42</literal> means
“execute <literal>return 42</literal> in the
<literal>IO</literal> monad, and bind the result to
<literal>x</literal>”. We can then use
Prelude>
</screen>
<para>An important difference between the two types of binding
- is that the monadic bind (<literal>p <- e</literal>) is
+ is that the monadic bind (<literal>p <- e</literal>) is
<emphasis>strict</emphasis> (it evaluates <literal>e</literal>),
whereas with the <literal>let</literal> form, the expression
isn't evaluated immediately:</para>
<para>The corresponding translation for an IO-typed
<replaceable>e</replaceable> is
<screen>
- it <- <replaceable>e</replaceable>
+ it <- <replaceable>e</replaceable>
</screen>
</para>
of <literal>it</literal> is lost.</para>
</sect2>
+
+ <sect2>
+ <title>Type defaulting in GHCi</title>
+ <indexterm><primary>Type default</primary></indexterm>
+ <indexterm><primary><literal>Show</literal> class</primary></indexterm>
+ <para>
+ Consider this GHCi session:
+<programlisting>
+ ghci> reverse []
+</programlisting>
+ What should GHCi do? Strictly speaking, the program is ambiguous. <literal>show (reverse [])</literal>
+ (which is what GHCi computes here) has type <literal>Show a => a</literal> and how that displays depends
+ on the type <literal>a</literal>. For example:
+<programlisting>
+ ghci> (reverse []) :: String
+ ""
+ ghci> (reverse []) :: [Int]
+ []
+</programlisting>
+ However, it is tiresome for the user to have to specify the type, so GHCi extends Haskell's type-defaulting
+ rules (Section 4.3.4 of the Haskell 98 Report (Revised)) as follows. If the expression yields a set of
+ type constraints that are all from standard classes (<literal>Num</literal>, <literal>Eq</literal> etc.),
+ and at least one is either a numeric class <emphasis>or the <literal>Show</literal>,
+ <literal>Eq</literal>, or <literal>Ord</literal> class</emphasis>,
+ GHCi will try to use one of the <literal>default</literal> types, just as described in the Report.
+ </para>
+ </sect2>
</sect1>
<sect1 id="ghci-invokation">
instructs GHCi to load the specified modules or filenames (and all
the modules they depend on), just as if you had said
<literal>:load <replaceable>modules</replaceable></literal> at the
- GHCi prompt (see <xref linkend="ghci-commands">). For example, to
+ GHCi prompt (see <xref linkend="ghci-commands"/>). For example, to
start GHCi and load the program whose topmost module is in the
file <literal>Main.hs</literal>, we could say:</para>
</screen>
<para>Most of the command-line options accepted by GHC (see <xref
- linkend="using-ghc">) also make sense in interactive mode. The ones
+ linkend="using-ghc"/>) also make sense in interactive mode. The ones
that don't make sense are mostly obvious; for example, GHCi
doesn't generate interface files, so options related to interface
file generation won't have any effect.</para>
<title>Packages</title>
<indexterm><primary>packages</primary><secondary>with GHCi</secondary></indexterm>
- <para>Most packages (see <xref linkend="using-packages">) are
+ <para>Most packages (see <xref linkend="using-packages"/>) are
available without needing to specify any extra flags at all:
they will be automatically loaded the first time they are
needed.</para>
the normal <literal>-l<replaceable>lib</replaceable></literal>
option. (The term <emphasis>library</emphasis> here refers to
libraries of foreign object code; for using libraries of Haskell
- source code, see <xref linkend="ghci-modules-filenames">.) For
+ source code, see <xref linkend="ghci-modules-filenames"/>.) For
example, to load the “m” library:</para>
<screen>
(<literal>.o</literal> or <literal>.obj</literal> depending on
your platform) from the command-line. Just add the name the
object file to the command line.</para>
+
+ <para>Ordering of <option>-l</option> options matters: a library
+ should be mentioned <emphasis>before</emphasis> the libraries it
+ depends on (see <xref linkend="options-linker"/>).</para>
</sect2>
</sect1>
beginning of <replaceable>dir</replaceable> will be replaced
by the contents of the environment variable
<literal>HOME</literal>.</para>
+
+ <para>NOTE: changing directories causes all currently loaded
+ modules to be unloaded. This is because the search path is
+ usually expressed using relative directories, and changing
+ the search path in the middle of a session is not
+ supported.</para>
</listitem>
</varlistentry>
<para>That's all a little confusing, so here's a few
examples. To start with, here's a new GHCi command which
doesn't take any arguments or produce any results, it just
- outputs the current date & time:</para>
+ outputs the current date & time:</para>
<screen>
Prelude> let date _ = Time.getClockTime >>= print >> return ""
<indexterm><primary><literal>:module</literal></primary></indexterm>
<listitem>
<para>Sets or modifies the current context for statements
- typed at the prompt. See <xref linkend="ghci-scope"> for
+ typed at the prompt. See <xref linkend="ghci-scope"/> for
more details.</para>
</listitem>
</varlistentry>
<term><literal>:set</literal> <optional><replaceable>option</replaceable>...</optional></term>
<indexterm><primary><literal>:set</literal></primary></indexterm>
<listitem>
- <para>Sets various options. See <xref linkend="ghci-set">
+ <para>Sets various options. See <xref linkend="ghci-set"/>
for a list of available options. The
<literal>:set</literal> command by itself shows which
options are currently set.</para>
</varlistentry>
<varlistentry>
+ <term><literal>:kind</literal> <replaceable>type</replaceable></term>
+ <indexterm><primary><literal>:kind</literal></primary></indexterm>
+ <listitem>
+ <para>Infers and prints the kind of
+ <replaceable>type</replaceable>. The latter can be an arbitrary
+ type expression, including a partial application of a type constructor,
+ such as <literal>Either Int</literal>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>:undef</literal> <replaceable>name</replaceable></term>
<indexterm><primary><literal>:undef</literal></primary></indexterm>
<listitem>
<term><literal>:unset</literal> <replaceable>option</replaceable>...</term>
<indexterm><primary><literal>:unset</literal></primary></indexterm>
<listitem>
- <para>Unsets certain options. See <xref linkend="ghci-set">
+ <para>Unsets certain options. See <xref linkend="ghci-set"/>
for a list of available options.</para>
</listitem>
</varlistentry>
<para>Any GHC command-line option that is designated as
<firstterm>dynamic</firstterm> (see the table in <xref
- linkend="flag-reference">), may be set using
+ linkend="flag-reference"/>), may be set using
<literal>:set</literal>. To unset an option, you can set the
reverse option:</para>
<indexterm><primary>dynamic</primary><secondary>options</secondary></indexterm>
Prelude> :set -fno-glasgow-exts
</screen>
- <para><xref linkend="flag-reference"> lists the reverse for each
+ <para><xref linkend="flag-reference"/> lists the reverse for each
option where applicable.</para>
<para>Certain static options (<option>-package</option>,