2.8. The :set and :seti commands

The :set command sets two types of
options: GHCi options, which begin with
‘+’, and “command-line”
options, which begin with ‘-’.

NOTE: at the moment, the :set command
doesn't support any kind of quoting in its arguments: quotes will
not be removed and cannot be used to group words together. For
example, :set -DFOO='BAR BAZ' will not do what
you expect.

2.8.1. GHCi options

GHCi options may be set using :set and
unset using :unset.

The available GHCi options are:

+m

Enable parsing of multiline commands. A multiline command
is prompted for when the current input line contains open layout
contexts (see Section 2.4.3, “Multiline input”).

+r

Normally, any evaluation of top-level expressions
(otherwise known as CAFs or Constant Applicative Forms) in
loaded modules is retained between evaluations. Turning
on +r causes all evaluation of
top-level expressions to be discarded after each
evaluation (they are still retained
during a single evaluation).

This option may help if the evaluated top-level
expressions are consuming large amounts of space, or if
you need repeatable performance measurements.

+s

Display some stats after evaluating each expression,
including the elapsed time and number of bytes allocated.
NOTE: the allocation figure is only accurate to the size
of the storage manager's allocation area, because it is
calculated at every GC. Hence, you might see values of
zero if no GC has occurred.

+t

Display the type of each variable bound after a
statement is entered at the prompt. If the statement is a
single expression, then the only variable binding will be
for the variable
‘it’.

2.8.2. Setting GHC command-line options in GHCi

Normal GHC command-line options may also be set using
:set. For example, to turn on
-fwarn-missing-signatures, you would say:

Prelude> :set -fwarn-missing-signatures

Any GHC command-line option that is designated as
dynamic (see the table in Section 4.19, “Flag reference”), may be set using
:set. To unset an option, you can set the
reverse option:

Certain static options (-package,
-I, -i, and
-l in particular) will also work, but some may
not take effect until the next reload.

2.8.3. Setting options for interactive evaluation only

GHCi actually maintains two sets of options:

The loading options apply when loading modules

The interactive options apply when evaluating expressions and commands typed at the GHCi prompt.

The :set command modifies both, but there is
also a :seti command (for "set
interactive") that affects only the interactive options set.

It is often useful to change the interactive options,
without having that option apply to loaded modules
too. For example

:seti -XMonoLocalBinds

It would be undesirable if -XMonoLocalBinds were to
apply to loaded modules too: that might cause a compilation error, but
more commonly it will cause extra recompilation, because GHC will think
that it needs to recompile the module because the flags have changed.

If you are setting language options in your .ghci file, it is good practice
to use :seti rather than :set,
unless you really do want them to apply to all modules you
load in GHCi.

The two sets of options can be inspected using the
:set and :seti commands
respectively, with no arguments. For example, in a clean GHCi
session we might see something like this: