diff options
Diffstat (limited to 'docs/users_guide/ghci.rst')
-rw-r--r-- | docs/users_guide/ghci.rst | 3014 |
1 files changed, 3014 insertions, 0 deletions
diff --git a/docs/users_guide/ghci.rst b/docs/users_guide/ghci.rst new file mode 100644 index 0000000000..b52d9e979b --- /dev/null +++ b/docs/users_guide/ghci.rst @@ -0,0 +1,3014 @@ +.. _ghci: + +Using GHCi +========== + +.. index:: + single: GHCi + single: interpreter + single: interactive + single: Hugs + single: Foreign Function Interface; GHCi support + single: FFI; GHCi support + +GHCi [1]_ is GHC's interactive environment, in which Haskell expressions +can be interactively evaluated and programs can be interpreted. If +you're familiar with `Hugs <http://www.haskell.org/hugs/>`__, then +you'll be right at home with GHCi. However, GHCi also has support for +interactively loading compiled code, as well as supporting all [2]_ the +language extensions that GHC provides. GHCi also includes an interactive +debugger (see :ref:`ghci-debugger`). + +.. [1] + The ‘i’ stands for “Interactive” + +.. [2] + except ``foreign export``, at the moment + + +.. _ghci-introduction: + +Introduction to GHCi +-------------------- + +Let's start with an example GHCi session. You can fire up GHCi with the +command ``ghci``: + +:: + + $ ghci + GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help + Loading package ghc-prim ... linking ... done. + Loading package integer-gmp ... linking ... done. + Loading package base ... linking ... done. + Loading package ffi-1.0 ... linking ... done. + Prelude> + +There may be a short pause while GHCi loads the prelude and standard +libraries, after which the prompt is shown. As the banner says, you can +type ``:?`` to see the list of commands available, and a half line +description of each of them. We'll explain most of these commands as we +go along, and there is complete documentation for all the commands in +:ref:`ghci-commands`. + +Haskell expressions can be typed at the prompt: + +.. index:: + single: prompt; GHCi + +:: + + Prelude> 1+2 + 3 + Prelude> let x = 42 in x / 9 + 4.666666666666667 + Prelude> + +GHCi interprets the whole line as an expression to evaluate. The +expression may not span several lines - as soon as you press enter, GHCi +will attempt to evaluate it. + +In Haskell, a ``let`` expression is followed by ``in``. However, in +GHCi, since the expression can also be interpreted in the ``IO`` monad, +a ``let`` binding with no accompanying ``in`` statement can be signalled +by an empty line, as in the above example. + +.. _loading-source-files: + +Loading source files +-------------------- + +Suppose we have the following Haskell source code, which we place in a +file ``Main.hs``: + +:: + + main = print (fac 20) + + fac 0 = 1 + fac n = n * fac (n-1) + +You can save ``Main.hs`` anywhere you like, but if you save it somewhere +other than the current directory [3]_ then we will need to change to the +right directory in GHCi: + +:: + + Prelude> :cd dir + +where ⟨dir⟩ is the directory (or folder) in which you saved ``Main.hs``. + +To load a Haskell source file into GHCi, use the ``:load`` command: + +.. index:: + single: :load + +:: + + Prelude> :load Main + Compiling Main ( Main.hs, interpreted ) + Ok, modules loaded: Main. + *Main> + +GHCi has loaded the ``Main`` module, and the prompt has changed to +“\ ``*Main>``\ ” to indicate that the current context for expressions +typed at the prompt is the ``Main`` module we just loaded (we'll explain +what the ``*`` means later in :ref:`ghci-scope`). So we can now type +expressions involving the functions from ``Main.hs``: + +:: + + *Main> fac 17 + 355687428096000 + +Loading a multi-module program is just as straightforward; just give the +name of the “topmost” module to the ``:load`` command (hint: ``:load`` +can be abbreviated to ``:l``). The topmost module will normally be +``Main``, but it doesn't have to be. GHCi will discover which modules +are required, directly or indirectly, by the topmost module, and load +them all in dependency order. + +.. [3] + If you started up GHCi from the command line then GHCi's current + directory is the same as the current directory of the shell from + which it was started. If you started GHCi from the “Start” menu in + Windows, then the current directory is probably something like + ``C:\Documents and Settings\user name``. + + +.. _ghci-modules-filenames: + +Modules vs. filenames +~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: modules; and filenames + single: filenames; of modules + +Question: How does GHC find the filename which contains module ⟨M⟩? +Answer: it looks for the file ``M.hs``, or ``M.lhs``. This means that +for most modules, the module name must match the filename. If it +doesn't, GHCi won't be able to find it. + +There is one exception to this general rule: when you load a program +with ``:load``, or specify it when you invoke ``ghci``, you can give a +filename rather than a module name. This filename is loaded if it +exists, and it may contain any module you like. This is particularly +convenient if you have several ``Main`` modules in the same directory +and you can't call them all ``Main.hs``. + +The search path for finding source files is specified with the ``-i`` +option on the GHCi command line, like so: + +:: + + ghci -idir1:...:dirn + +or it can be set using the ``:set`` command from within GHCi (see +:ref:`ghci-cmd-line-options`) [4]_ + +One consequence of the way that GHCi follows dependencies to find +modules to load is that every module must have a source file. The only +exception to the rule is modules that come from a package, including the +``Prelude`` and standard libraries such as ``IO`` and ``Complex``. If +you attempt to load a module for which GHCi can't find a source file, +even if there are object and interface files for the module, you'll get +an error message. + +.. [4] + Note that in GHCi, and ``--make`` mode, the ``-i`` option is used to + specify the search path for *source* files, whereas in standard + batch-compilation mode the ``-i`` option is used to specify the + search path for interface files, see :ref:`search-path`. + + +Making changes and recompilation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: :reload + +If you make some changes to the source code and want GHCi to recompile +the program, give the ``:reload`` command. The program will be +recompiled as necessary, with GHCi 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 :ref:`recomp`). + +.. _ghci-compiled: + +Loading compiled code +--------------------- + +.. index:: + single: compiled code; in GHCi + +When you load a Haskell source module into GHCi, it is normally +converted to byte-code and run using the interpreter. However, +interpreted code can also run alongside compiled code in GHCi; indeed, +normally when GHCi starts, it loads up a compiled copy of the ``base`` +package, which contains the ``Prelude``. + +Why should we want to run compiled code? Well, compiled code is roughly +10x faster than interpreted code, but takes about 2x longer to produce +(perhaps longer if optimisation is on). So it pays to compile the parts +of a program that aren't changing very often, and use the interpreter +for the code being actively developed. + +When loading up source modules with ``:load``, GHCi normally looks for +any corresponding compiled object files, and will 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`` and ``C``: + +:: + + A + / \ + B C + \ / + D + +We can compile ``D``, then load the whole program, like this: + +:: + + Prelude> :! ghc -c -dynamic D.hs + Prelude> :load A + Compiling B ( B.hs, interpreted ) + Compiling C ( C.hs, interpreted ) + Compiling A ( A.hs, interpreted ) + Ok, modules loaded: A, B, C, D. + *Main> + +In the messages from the compiler, we see that there is no line for +``D``. This is because it isn't necessary to compile ``D``, because the +source and everything it depends on is unchanged since the last +compilation. + +Note the ``-dynamic`` flag to GHC: GHCi uses dynamically-linked object +code (if you are on a platform that supports it), and so in order to use +compiled code with GHCi it must be compiled for dynamic linking. + +At any time you can use the command ``:show modules`` to get a list of +the modules currently loaded into GHCi: + +:: + + *Main> :show modules + D ( D.hs, D.o ) + C ( C.hs, interpreted ) + B ( B.hs, interpreted ) + A ( A.hs, interpreted ) + *Main> + +If we now modify the source of ``D`` (or pretend to: using the Unix command +``touch`` on the source file is handy for this), the compiler will no +longer be able to use the object file, because it might be out of date: + +:: + + *Main> :! touch D.hs + *Main> :reload + Compiling D ( D.hs, interpreted ) + Ok, modules loaded: A, B, C, D. + *Main> + +Note that module ``D`` was compiled, but in this instance because its source +hadn't really changed, its interface remained the same, and the +recompilation checker determined that ``A``, ``B`` and ``C`` didn't need to be +recompiled. + +So let's try compiling one of the other modules: + +:: + + *Main> :! ghc -c C.hs + *Main> :load A + Compiling D ( D.hs, interpreted ) + Compiling B ( B.hs, interpreted ) + Compiling C ( C.hs, interpreted ) + Compiling A ( A.hs, interpreted ) + Ok, modules loaded: A, B, C, D. + +We didn't get the compiled version of ``C``! What happened? Well, in GHCi a +compiled module may only depend on other compiled modules, and in this +case ``C`` depends on ``D``, which doesn't have an object file, so GHCi also +rejected ``C``\'s object file. Ok, so let's also compile ``D``: + +:: + + *Main> :! ghc -c D.hs + *Main> :reload + Ok, modules loaded: A, B, C, D. + +Nothing happened! Here's another lesson: newly compiled modules aren't +picked up by ``:reload``, only ``:load``: + +:: + + *Main> :load A + Compiling B ( B.hs, interpreted ) + Compiling A ( A.hs, interpreted ) + Ok, modules loaded: A, B, C, D. + +The automatic loading of object files can sometimes lead to confusion, +because non-exported top-level definitions of a module are only +available for use in expressions at the prompt when the module is +interpreted (see :ref:`ghci-scope`). For this reason, you might +sometimes want to force GHCi to load a module using the interpreter. +This can be done by prefixing a ``*`` to the module name or filename +when using ``:load``, for example + +:: + + Prelude> :load *A + Compiling A ( A.hs, interpreted ) + *A> + +When the ``*`` is used, GHCi ignores any pre-compiled object code and +interprets the module. If you have already loaded a number of modules as +object code and decide that you wanted to interpret one of them, instead +of re-loading the whole set you can use ``:add *M`` to specify that you +want ``M`` to be interpreted (note that this might cause other modules +to be interpreted too, because compiled modules cannot depend on +interpreted ones). + +To always compile everything to object code and never use the +interpreter, use the ``-fobject-code`` option (see :ref:`ghci-obj`). + +.. hint:: + Since GHCi will only use a compiled object file if it can be sure + that the compiled version is up-to-date, a good technique when working + on a large program is to occasionally run ``ghc --make`` to compile the + whole project (say before you go for lunch :-), then continue working in + the interpreter. As you modify code, the changed modules will be + interpreted, but the rest of the project will remain compiled. + +.. _interactive-evaluation: + +Interactive evaluation at the prompt +------------------------------------ + +When you type an expression at the prompt, GHCi immediately evaluates +and prints the result: + +:: + + Prelude> reverse "hello" + "olleh" + Prelude> 5+5 + 10 + +.. _actions-at-prompt: + +I/O actions at the prompt +~~~~~~~~~~~~~~~~~~~~~~~~~ + +GHCi does more than simple expression evaluation at the prompt. If you +enter an expression of type ``IO a`` for some ``a``, then GHCi +*executes* it as an IO-computation. + +:: + + Prelude> "hello" + "hello" + Prelude> putStrLn "hello" + hello + +This works even if the type of the expression is more general, provided +it can be *instantiated* to ``IO a``. For example + +:: + + Prelude> return True + True + +Furthermore, GHCi will print the result of the I/O action if (and only +if): + +- The result type is an instance of ``Show``. + +- The result type is not ``()``. + +For example, remembering that ``putStrLn :: String -> IO ()``: + +:: + + Prelude> putStrLn "hello" + hello + Prelude> do { putStrLn "hello"; return "yes" } + hello + "yes" + +.. _ghci-stmts: + +Using ``do-``\ notation at the prompt +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: do-notation; in GHCi + single: statements; in GHCi + +GHCi actually accepts statements rather than just expressions at the +prompt. This means you can bind values and functions to names, and use +them in future expressions or statements. + +The syntax of a statement accepted at the GHCi prompt is exactly the +same as the syntax of a statement in a Haskell ``do`` expression. +However, there's no monad overloading here: statements typed at the +prompt must be in the ``IO`` monad. + +:: + + Prelude> x <- return 42 + Prelude> print x + 42 + Prelude> + +The statement ``x <- return 42`` means “execute ``return 42`` in the +``IO`` monad, and bind the result to ``x``\ ”. We can then use ``x`` in +future statements, for example to print it as we did above. + +If ``-fprint-bind-result`` is set then GHCi will print the result of a +statement if and only if: + +- The statement is not a binding, or it is a monadic binding + (``p <- e``) that binds exactly one variable. + +- The variable's type is not polymorphic, is not ``()``, and is an + instance of ``Show``. + +.. index:: + single: -fprint-bind-result + +Of course, you can also bind normal non-IO expressions using the +``let``\-statement: + +:: + + Prelude> let x = 42 + Prelude> x + 42 + Prelude> + +Another important difference between the two types of binding is that +the monadic bind (``p <- e``) is *strict* (it evaluates ``e``), whereas +with the ``let`` form, the expression isn't evaluated immediately: + +:: + + Prelude> let x = error "help!" + Prelude> print x + *** Exception: help! + Prelude> + +Note that ``let`` bindings do not automatically print the value bound, +unlike monadic bindings. + +You can also use ``let``-statements to define functions at the +prompt: + +:: + + Prelude> let add a b = a + b + Prelude> add 1 2 + 3 + Prelude> + +However, this quickly gets tedious when defining functions with multiple +clauses, or groups of mutually recursive functions, because the complete +definition has to be given on a single line, using explicit semicolons +instead of layout: + +:: + + Prelude> let f op n [] = n ; f op n (h:t) = h `op` f op n t + Prelude> f (+) 0 [1..3] + 6 + Prelude> + +To alleviate this issue, GHCi commands can be split over multiple lines, +by wrapping them in ``:{`` and ``:}`` (each on a single line of its +own): + +:: + + Prelude> :{ + Prelude| let g op n [] = n + Prelude| g op n (h:t) = h `op` g op n t + Prelude| :} + Prelude> g (*) 1 [1..3] + 6 + +Such multiline commands can be used with any GHCi command, and note that +the layout rule is in effect. The main purpose of multiline commands is +not to replace module loading but to make definitions in .ghci-files +(see :ref:`ghci-dot-files`) more readable and maintainable. + +Any exceptions raised during the evaluation or execution of the +statement are caught and printed by the GHCi command line interface (for +more information on exceptions, see the module ``Control.Exception`` in +the libraries documentation). + +Every new binding shadows any existing bindings of the same name, +including entities that are in scope in the current module context. + +.. warning:: + Temporary bindings introduced at the prompt only last until the + next ``:load`` or ``:reload`` command, at which time they will be simply + lost. However, they do survive a change of context with ``:module``: the + temporary bindings just move to the new location. + +.. hint:: + To get a list of the bindings currently in scope, use the + ``:show bindings`` command: + + :: + + Prelude> :show bindings + x :: Int + Prelude> + +.. hint:: + If you turn on the ``+t`` option, GHCi will show the type of each + variable bound by a statement. For example: + + :: + + Prelude> :set +t + Prelude> let (x:xs) = [1..] + x :: Integer + xs :: [Integer] + + .. index:: + single: +t option; in GHCi + + +.. _ghci-multiline: + +Multiline input +~~~~~~~~~~~~~~~ + +Apart from the ``:{ ... :}`` syntax for multi-line input mentioned +above, GHCi also has a multiline mode, enabled by ``:set +m``, +``:set +m`` in which GHCi detects automatically when the current +statement is unfinished and allows further lines to be added. A +multi-line input is terminated with an empty line. For example: + +:: + + Prelude> :set +m + Prelude> let x = 42 + Prelude| + +Further bindings can be added to this ``let`` statement, so GHCi +indicates that the next line continues the previous one by changing the +prompt. Note that layout is in effect, so to add more bindings to this +``let`` we have to line them up: + +:: + + Prelude> :set +m + Prelude> let x = 42 + Prelude| y = 3 + Prelude| + Prelude> + +Explicit braces and semicolons can be used instead of layout: + +:: + + Prelude> do { + Prelude| putStrLn "hello" + Prelude| ;putStrLn "world" + Prelude| } + hello + world + Prelude> + +Note that after the closing brace, GHCi knows that the current statement +is finished, so no empty line is required. + +Multiline mode is useful when entering monadic ``do`` statements: + +:: + + Control.Monad.State> flip evalStateT 0 $ do + Control.Monad.State| i <- get + Control.Monad.State| lift $ do + Control.Monad.State| putStrLn "Hello World!" + Control.Monad.State| print i + Control.Monad.State| + "Hello World!" + 0 + Control.Monad.State> + +During a multiline interaction, the user can interrupt and return to the +top-level prompt. + +:: + + Prelude> do + Prelude| putStrLn "Hello, World!" + Prelude| ^C + Prelude> + +.. _ghci-decls: + +Type, class and other declarations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +At the GHCi prompt you can also enter any top-level Haskell declaration, +including ``data``, ``type``, ``newtype``, ``class``, ``instance``, +``deriving``, and ``foreign`` declarations. For example: + +:: + + Prelude> data T = A | B | C deriving (Eq, Ord, Show, Enum) + Prelude> [A ..] + [A,B,C] + Prelude> :i T + data T = A | B | C -- Defined at <interactive>:2:6 + instance Enum T -- Defined at <interactive>:2:45 + instance Eq T -- Defined at <interactive>:2:30 + instance Ord T -- Defined at <interactive>:2:34 + instance Show T -- Defined at <interactive>:2:39 + +As with ordinary variable bindings, later definitions shadow earlier +ones, so you can re-enter a declaration to fix a problem with it or +extend it. But there's a gotcha: when a new type declaration shadows an +older one, there might be other declarations that refer to the old type. +The thing to remember is that the old type still exists, and these other +declarations still refer to the old type. However, while the old and the +new type have the same name, GHCi will treat them as distinct. For +example: + +:: + + Prelude> data T = A | B + Prelude> let f A = True; f B = False + Prelude> data T = A | B | C + Prelude> f A + + <interactive>:2:3: + Couldn't match expected type `main::Interactive.T' + with actual type `T' + In the first argument of `f', namely `A' + In the expression: f A + In an equation for `it': it = f A + Prelude> + +The old, shadowed, version of ``T`` is displayed as +``main::Interactive.T`` by GHCi in an attempt to distinguish it from the +new ``T``, which is displayed as simply ``T``. + +Class and type-family instance declarations are simply added to the list +of available instances, with one exception. Since you might want to +re-define one, a class or type-family instance *replaces* any earlier +instance with an identical head or left hand side (respectively). (See +:ref:`type-families`.) + +.. _ghci-scope: + +What's really in scope at the prompt? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When you type an expression at the prompt, what identifiers and types +are in scope? GHCi provides a flexible way to control exactly how the +context for an expression is constructed: + +- The ``:load``, ``:add``, and ``:reload`` commands + (:ref:`ghci-load-scope`). + +- The ``import`` declaration (:ref:`ghci-import-decl`). + +- The ``:module`` command (:ref:`ghci-module-cmd`). + +The command ``:show imports`` will show a summary of which modules +contribute to the top-level scope. + +.. hint:: + GHCi will tab-complete names that are in scope; for example, if + you run GHCi and type ``J<tab>`` then GHCi will expand it to + “\ ``Just``\ ”. + +.. _ghci-load-scope: + +The effect of ``:load`` on what is in scope +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``:load``, ``:add``, and ``:reload`` commands +(:ref:`loading-source-files` and :ref:`ghci-compiled`) affect the +top-level scope. Let's start with the simple cases; when you start GHCi +the prompt looks like this: + +:: + + Prelude> + +which indicates that everything from the module ``Prelude`` is currently +in scope; the visible identifiers are exactly those that would be +visible in a Haskell source file with no ``import`` declarations. + +If we now load a file into GHCi, the prompt will change: + +:: + + Prelude> :load Main.hs + Compiling Main ( Main.hs, interpreted ) + *Main> + +The new prompt is ``*Main``, which indicates that we are typing +expressions in the context of the top-level of the ``Main`` module. +Everything that is in scope at the top-level in the module ``Main`` we +just loaded is also in scope at the prompt (probably including +``Prelude``, as long as ``Main`` doesn't explicitly hide it). + +The syntax in the prompt ``*module`` indicates that it is the full +top-level scope of ⟨module⟩ that is contributing to the scope for +expressions typed at the prompt. Without the ``*``, just the exports of +the module are visible. + +.. note:: + For technical reasons, GHCi can only support the ``*``-form for + modules that are interpreted. Compiled modules and package modules can + only contribute their exports to the current scope. To ensure that GHCi + loads the interpreted version of a module, add the ``*`` when loading + the module, e.g. ``:load *M``. + +In general, after a ``:load`` command, an automatic import is added to +the scope for the most recently loaded "target" module, in a ``*``-form +if possible. For example, if you say ``:load foo.hs bar.hs`` and +``bar.hs`` contains module ``Bar``, then the scope will be set to +``*Bar`` if ``Bar`` is interpreted, or if ``Bar`` is compiled it will be +set to ``Prelude Bar`` (GHCi automatically adds ``Prelude`` if it isn't +present and there aren't any ``*``-form modules). These +automatically-added imports can be seen with ``:show imports``: + +:: + + Prelude> :load hello.hs + [1 of 1] Compiling Main ( hello.hs, interpreted ) + Ok, modules loaded: Main. + *Main> :show imports + :module +*Main -- added automatically + *Main> + +and the automatically-added import is replaced the next time you use +``:load``, ``:add``, or ``:reload``. It can also be removed by +``:module`` as with normal imports. + +.. _ghci-import-decl: + +Controlling what is in scope with ``import`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We are not limited to a single module: GHCi can combine scopes from +multiple modules, in any mixture of ``*`` and non-\ ``*`` forms. GHCi +combines the scopes from all of these modules to form the scope that is +in effect at the prompt. + +To add modules to the scope, use ordinary Haskell ``import`` syntax: + +:: + + Prelude> import System.IO + Prelude System.IO> hPutStrLn stdout "hello\n" + hello + Prelude System.IO> + +The full Haskell import syntax is supported, including ``hiding`` and +``as`` clauses. The prompt shows the modules that are currently +imported, but it omits details about ``hiding``, ``as``, and so on. To +see the full story, use ``:show imports``: + +:: + + Prelude> import System.IO + Prelude System.IO> import Data.Map as Map + Prelude System.IO Map> :show imports + import Prelude -- implicit + import System.IO + import Data.Map as Map + Prelude System.IO Map> + +Note that the ``Prelude`` import is marked as implicit. It can be +overridden with an explicit ``Prelude`` import, just like in a Haskell +module. + +With multiple modules in scope, especially multiple ``*``-form modules, +it is likely that name clashes will occur. Haskell specifies that name +clashes are only reported when an ambiguous identifier is used, and GHCi +behaves in the same way for expressions typed at the prompt. + +.. _ghci-module-cmd: + +Controlling what is in scope with the ``:module`` command +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Another way to manipulate the scope is to use the ``:module`` command, +whose syntax is this: + +:: + + :module +|- *mod1 ... *modn + +Using the ``+`` form of the ``module`` commands adds modules to the +current scope, and ``-`` removes them. Without either ``+`` or ``-``, +the current scope is replaced by the set of modules specified. Note that +if you use this form and leave out ``Prelude``, an implicit ``Prelude`` +import will be added automatically. + +The ``:module`` command provides a way to do two things that cannot be +done with ordinary ``import`` declarations: + +- ``:module`` supports the ``*`` modifier on modules, which opens the + full top-level scope of a module, rather than just its exports. + +- Imports can be *removed* from the context, using the syntax + ``:module -M``. The ``import`` syntax is cumulative (as in a Haskell + module), so this is the only way to subtract from the scope. + +.. _ghci-import-qualified: + +Qualified names +^^^^^^^^^^^^^^^ + +To make life slightly easier, the GHCi prompt also behaves as if there +is an implicit ``import qualified`` declaration for every module in +every package, and every module currently loaded into GHCi. This +behaviour can be disabled with the ``-fno-implicit-import-qualified`` flag. + +.. index:: + single: -fno-implicit-import-qualified + +``:module`` and ``:load`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +It might seem that ``:module``/``import`` and +``:load``/``:add``/``:reload`` do similar things: you can use both to +bring a module into scope. However, there is a very important +difference. GHCi is concerned with two sets of modules: + +- The set of modules that are currently *loaded*. This set is modified + by ``:load``, ``:add`` and ``:reload``, and can be shown with + ``:show modules``. + +- The set of modules that are currently *in scope* at the prompt. This + set is modified by ``import`` and ``:module``, and it is also + modified automatically after ``:load``, ``:add``, and ``:reload``, as + described above. The set of modules in scope can be shown with + ``:show imports``. + +You can add a module to the scope (via ``:module`` or ``import``) only +if either (a) it is loaded, or (b) it is a module from a package that +GHCi knows about. Using ``:module`` or ``import`` to try bring into +scope a non-loaded module may result in the message +“\ ``module M is not loaded``\ ”. + +The ``:main`` and ``:run`` commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When a program is compiled and executed, it can use the ``getArgs`` +function to access the command-line arguments. However, we cannot simply +pass the arguments to the ``main`` function while we are testing in +ghci, as the ``main`` function doesn't take its directly. + +Instead, we can use the ``:main`` command. This runs whatever ``main`` +is in scope, with any arguments being treated the same as command-line +arguments, e.g.: + +:: + + Prelude> let main = System.Environment.getArgs >>= print + Prelude> :main foo bar + ["foo","bar"] + +We can also quote arguments which contains characters like spaces, and +they are treated like Haskell strings, or we can just use Haskell list +syntax: + +:: + + Prelude> :main foo "bar baz" + ["foo","bar baz"] + Prelude> :main ["foo", "bar baz"] + ["foo","bar baz"] + +Finally, other functions can be called, either with the ``-main-is`` +flag or the ``:run`` command: + +:: + + Prelude> let foo = putStrLn "foo" >> System.Environment.getArgs >>= print + Prelude> let bar = putStrLn "bar" >> System.Environment.getArgs >>= print + Prelude> :set -main-is foo + Prelude> :main foo "bar baz" + foo + ["foo","bar baz"] + Prelude> :run bar ["foo", "bar baz"] + bar + ["foo","bar baz"] + +The ``it`` variable +~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: it variable + +Whenever an expression (or a non-binding statement, to be precise) is +typed at the prompt, GHCi implicitly binds its value to the variable +``it``. For example: + +:: + + Prelude> 1+2 + 3 + Prelude> it * 2 + 6 + +What actually happens is that GHCi typechecks the expression, and if it +doesn't have an ``IO`` type, then it transforms it as follows: an +expression ``e`` turns into + +:: + + let it = e; + print it + +which is then run as an IO-action. + +Hence, the original expression must have a type which is an instance of +the ``Show`` class, or GHCi will complain: + +:: + + Prelude> id + + <interactive>:1:0: + No instance for (Show (a -> a)) + arising from use of `print' at <interactive>:1:0-1 + Possible fix: add an instance declaration for (Show (a -> a)) + In the expression: print it + In a 'do' expression: print it + +The error message contains some clues as to the transformation happening +internally. + +If the expression was instead of type ``IO a`` for some ``a``, then +``it`` will be bound to the result of the ``IO`` computation, which is +of type ``a``. eg.: + +:: + + Prelude> Time.getClockTime + Wed Mar 14 12:23:13 GMT 2001 + Prelude> print it + Wed Mar 14 12:23:13 GMT 2001 + +The corresponding translation for an IO-typed ``e`` is + +:: + + it <- e + +Note that ``it`` is shadowed by the new value each time you evaluate a +new expression, and the old value of ``it`` is lost. + +.. _extended-default-rules: + +Type defaulting in GHCi +~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: Type defaulting; in GHCi + single: Show class + +Consider this GHCi session: + +:: + + ghci> reverse [] + +What should GHCi do? Strictly speaking, the program is ambiguous. +``show (reverse [])`` (which is what GHCi computes here) has type +``Show a => String`` and how that displays depends on the type ``a``. +For example: + +:: + + ghci> reverse ([] :: String) + "" + ghci> reverse ([] :: [Int]) + [] + +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 2010 Report) as follows. The standard rules take each group of +constraints ``(C1 a, C2 a, ..., Cn a)`` for each type variable ``a``, +and defaults the type variable if + +1. The type variable ``a`` appears in no other constraints + +2. All the classes ``Ci`` are standard. + +3. At least one of the classes ``Ci`` is numeric. + +At the GHCi prompt, or with GHC if the ``-XExtendedDefaultRules`` flag +is given, the following additional differences apply: + +- Rule 2 above is relaxed thus: *All* of the classes ``Ci`` are + single-parameter type classes. + +- Rule 3 above is relaxed this: At least one of the classes ``Ci`` is + numeric, or is ``Show``, ``Eq``, or ``Ord``. + +- The unit type ``()`` is added to the start of the standard list of + types which are tried when doing type defaulting. + +The last point means that, for example, this program: + +:: + + main :: IO () + main = print def + + instance Num () + + def :: (Num a, Enum a) => a + def = toEnum 0 + +prints ``()`` rather than ``0`` as the type is defaulted to ``()`` +rather than ``Integer``. + +The motivation for the change is that it means ``IO a`` actions default +to ``IO ()``, which in turn means that ghci won't try to print a result +when running them. This is particularly important for ``printf``, which +has an instance that returns ``IO a``. However, it is only able to +return ``undefined`` (the reason for the instance having this type is so +that printf doesn't require extensions to the class system), so if the +type defaults to ``Integer`` then ghci gives an error when running a +printf. + +See also :ref:`actions-at-prompt` for how the monad of a computational +expression defaults to ``IO`` if possible. + +.. _ghci-interactive-print: + +Using a custom interactive printing function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: Custom printing function; in GHCi + +[**New in version 7.6.1**] By default, GHCi prints the result of +expressions typed at the prompt using the function ``System.IO.print``. +Its type signature is ``Show a => a -> IO ()``, and it works by +converting the value to ``String`` using ``show``. + +This is not ideal in certain cases, like when the output is long, or +contains strings with non-ascii characters. + +The ``-interactive-print`` flag allows to specify any function of type +``C a => a -> IO ()``, for some constraint ``C``, as the function for +printing evaluated expressions. The function can reside in any loaded +module or any registered package. + +As an example, suppose we have following special printing module: + +:: + + module SpecPrinter where + import System.IO + + sprint a = putStrLn $ show a ++ "!" + +The ``sprint`` function adds an exclamation mark at the end of any +printed value. Running GHCi with the command: + +:: + + ghci -interactive-print=SpecPrinter.sprinter SpecPrinter + +will start an interactive session where values with be printed using +``sprint``: + +:: + + *SpecPrinter> [1,2,3] + [1,2,3]! + *SpecPrinter> 42 + 42! + +A custom pretty printing function can be used, for example, to format +tree-like and nested structures in a more readable way. + +The ``-interactive-print`` flag can also be used when running GHC in +``-e mode``: + +:: + + % ghc -e "[1,2,3]" -interactive-print=SpecPrinter.sprint SpecPrinter + [1,2,3]! + +.. _ghci-debugger: + +The GHCi Debugger +----------------- + +.. index:: + single: debugger; in GHCi + +GHCi contains a simple imperative-style debugger in which you can stop a +running computation in order to examine the values of variables. The +debugger is integrated into GHCi, and is turned on by default: no flags +are required to enable the debugging facilities. There is one major +restriction: breakpoints and single-stepping are only available in +interpreted modules; compiled code is invisible to the debugger [5]_. + +The debugger provides the following: + +- The ability to set a breakpoint on a function definition or + expression in the program. When the function is called, or the + expression evaluated, GHCi suspends execution and returns to the + prompt, where you can inspect the values of local variables before + continuing with the execution. + +- Execution can be single-stepped: the evaluator will suspend execution + approximately after every reduction, allowing local variables to be + inspected. This is equivalent to setting a breakpoint at every point + in the program. + +- Execution can take place in tracing mode, in which the evaluator + remembers each evaluation step as it happens, but doesn't suspend + execution until an actual breakpoint is reached. When this happens, + the history of evaluation steps can be inspected. + +- Exceptions (e.g. pattern matching failure and ``error``) can be + treated as breakpoints, to help locate the source of an exception in + the program. + +There is currently no support for obtaining a “stack trace”, but the +tracing and history features provide a useful second-best, which will +often be enough to establish the context of an error. For instance, it +is possible to break automatically when an exception is thrown, even if +it is thrown from within compiled code (see +:ref:`ghci-debugger-exceptions`). + +.. _breakpoints: + +Breakpoints and inspecting variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Let's use quicksort as a running example. Here's the code: + +:: + + qsort [] = [] + qsort (a:as) = qsort left ++ [a] ++ qsort right + where (left,right) = (filter (<=a) as, filter (>a) as) + + main = print (qsort [8, 4, 0, 3, 1, 23, 11, 18]) + +First, load the module into GHCi: + +:: + + Prelude> :l qsort.hs + [1 of 1] Compiling Main ( qsort.hs, interpreted ) + Ok, modules loaded: Main. + *Main> + +Now, let's set a breakpoint on the right-hand-side of the second +equation of qsort: + +:: + + *Main> :break 2 + Breakpoint 0 activated at qsort.hs:2:15-46 + *Main> + +The command ``:break 2`` sets a breakpoint on line 2 of the most +recently-loaded module, in this case ``qsort.hs``. Specifically, it +picks the leftmost complete subexpression on that line on which to set +the breakpoint, which in this case is the expression +``(qsort left ++ [a] ++ qsort right)``. + +Now, we run the program: + +:: + + *Main> main + Stopped at qsort.hs:2:15-46 + _result :: [a] + a :: a + left :: [a] + right :: [a] + [qsort.hs:2:15-46] *Main> + +Execution has stopped at the breakpoint. The prompt has changed to +indicate that we are currently stopped at a breakpoint, and the +location: ``[qsort.hs:2:15-46]``. To further clarify the location, we +can use the ``:list`` command: + +:: + + [qsort.hs:2:15-46] *Main> :list + 1 qsort [] = [] + 2 qsort (a:as) = qsort left ++ [a] ++ qsort right + 3 where (left,right) = (filter (<=a) as, filter (>a) as) + +The ``:list`` command lists the source code around the current +breakpoint. If your output device supports it, then GHCi will highlight +the active subexpression in bold. + +GHCi has provided bindings for the free variables [6]_ of the expression +on which the breakpoint was placed (``a``, ``left``, ``right``), and +additionally a binding for the result of the expression (``_result``). +These variables are just like other variables that you might define in +GHCi; you can use them in expressions that you type at the prompt, you +can ask for their types with ``:type``, and so on. There is one +important difference though: these variables may only have partial +types. For example, if we try to display the value of ``left``: + +:: + + [qsort.hs:2:15-46] *Main> left + + <interactive>:1:0: + Ambiguous type variable `a' in the constraint: + `Show a' arising from a use of `print' at <interactive>:1:0-3 + Cannot resolve unknown runtime types: a + Use :print or :force to determine these types + +This is because ``qsort`` is a polymorphic function, and because GHCi +does not carry type information at runtime, it cannot determine the +runtime types of free variables that involve type variables. Hence, when +you ask to display ``left`` at the prompt, GHCi can't figure out which +instance of ``Show`` to use, so it emits the type error above. + +Fortunately, the debugger includes a generic printing command, +``:print``, which can inspect the actual runtime value of a variable and +attempt to reconstruct its type. If we try it on ``left``: + +:: + + [qsort.hs:2:15-46] *Main> :set -fprint-evld-with-show + [qsort.hs:2:15-46] *Main> :print left + left = (_t1::[a]) + +This isn't particularly enlightening. What happened is that ``left`` is +bound to an unevaluated computation (a suspension, or thunk), and +``:print`` does not force any evaluation. The idea is that ``:print`` +can be used to inspect values at a breakpoint without any unfortunate +side effects. It won't force any evaluation, which could cause the +program to give a different answer than it would normally, and hence it +won't cause any exceptions to be raised, infinite loops, or further +breakpoints to be triggered (see :ref:`nested-breakpoints`). Rather than +forcing thunks, ``:print`` binds each thunk to a fresh variable +beginning with an underscore, in this case ``_t1``. + +The flag ``-fprint-evld-with-show`` instructs ``:print`` to reuse +available ``Show`` instances when possible. This happens only when the +contents of the variable being inspected are completely evaluated. + +If we aren't concerned about preserving the evaluatedness of a variable, +we can use ``:force`` instead of ``:print``. The ``:force`` command +behaves exactly like ``:print``, except that it forces the evaluation of +any thunks it encounters: + +:: + + [qsort.hs:2:15-46] *Main> :force left + left = [4,0,3,1] + +Now, since ``:force`` has inspected the runtime value of ``left``, it +has reconstructed its type. We can see the results of this type +reconstruction: + +:: + + [qsort.hs:2:15-46] *Main> :show bindings + _result :: [Integer] + a :: Integer + left :: [Integer] + right :: [Integer] + _t1 :: [Integer] + +Not only do we now know the type of ``left``, but all the other partial +types have also been resolved. So we can ask for the value of ``a``, for +example: + +:: + + [qsort.hs:2:15-46] *Main> a + 8 + +You might find it useful to use Haskell's ``seq`` function to evaluate +individual thunks rather than evaluating the whole expression with +``:force``. For example: + +:: + + [qsort.hs:2:15-46] *Main> :print right + right = (_t1::[Integer]) + [qsort.hs:2:15-46] *Main> seq _t1 () + () + [qsort.hs:2:15-46] *Main> :print right + right = 23 : (_t2::[Integer]) + +We evaluated only the ``_t1`` thunk, revealing the head of the list, and +the tail is another thunk now bound to ``_t2``. The ``seq`` function is +a little inconvenient to use here, so you might want to use ``:def`` to +make a nicer interface (left as an exercise for the reader!). + +Finally, we can continue the current execution: + +:: + + [qsort.hs:2:15-46] *Main> :continue + Stopped at qsort.hs:2:15-46 + _result :: [a] + a :: a + left :: [a] + right :: [a] + [qsort.hs:2:15-46] *Main> + +The execution continued at the point it previously stopped, and has now +stopped at the breakpoint for a second time. + +.. _setting-breakpoints: + +Setting breakpoints +^^^^^^^^^^^^^^^^^^^ + +Breakpoints can be set in various ways. Perhaps the easiest way to set a +breakpoint is to name a top-level function: + +:: + + :break identifier + +Where ⟨identifier⟩ names any top-level function in an interpreted module +currently loaded into GHCi (qualified names may be used). The breakpoint +will be set on the body of the function, when it is fully applied but +before any pattern matching has taken place. + +Breakpoints can also be set by line (and optionally column) number: + +:: + + :break line + :break line column + :break module line + :break module line column + +When a breakpoint is set on a particular line, GHCi sets the breakpoint +on the leftmost subexpression that begins and ends on that line. If two +complete subexpressions start at the same column, the longest one is +picked. If there is no complete subexpression on the line, then the +leftmost expression starting on the line is picked, and failing that the +rightmost expression that partially or completely covers the line. + +When a breakpoint is set on a particular line and column, GHCi picks the +smallest subexpression that encloses that location on which to set the +breakpoint. Note: GHC considers the TAB character to have a width of 1, +wherever it occurs; in other words it counts characters, rather than +columns. This matches what some editors do, and doesn't match others. +The best advice is to avoid tab characters in your source code +altogether (see ``-fwarn-tabs`` in :ref:`options-sanity`). + +If the module is omitted, then the most recently-loaded module is used. + +Not all subexpressions are potential breakpoint locations. Single +variables are typically not considered to be breakpoint locations +(unless the variable is the right-hand-side of a function definition, +lambda, or case alternative). The rule of thumb is that all redexes are +breakpoint locations, together with the bodies of functions, lambdas, +case alternatives and binding statements. There is normally no +breakpoint on a let expression, but there will always be a breakpoint on +its body, because we are usually interested in inspecting the values of +the variables bound by the let. + +Listing and deleting breakpoints +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The list of breakpoints currently enabled can be displayed using +``:show breaks``: + +:: + + *Main> :show breaks + [0] Main qsort.hs:1:11-12 + [1] Main qsort.hs:2:15-46 + +To delete a breakpoint, use the ``:delete`` command with the number +given in the output from ``:show breaks``: + +:: + + *Main> :delete 0 + *Main> :show breaks + [1] Main qsort.hs:2:15-46 + +To delete all breakpoints at once, use ``:delete *``. + +.. _single-stepping: + +Single-stepping +~~~~~~~~~~~~~~~ + +Single-stepping is a great way to visualise the execution of your +program, and it is also a useful tool for identifying the source of a +bug. GHCi offers two variants of stepping. Use ``:step`` to enable all +the breakpoints in the program, and execute until the next breakpoint is +reached. Use ``:steplocal`` to limit the set of enabled breakpoints to +those in the current top level function. Similarly, use ``:stepmodule`` +to single step only on breakpoints contained in the current module. For +example: + +:: + + *Main> :step main + Stopped at qsort.hs:5:7-47 + _result :: IO () + +The command ``:step expr`` begins the evaluation of ⟨expr⟩ in +single-stepping mode. If ⟨expr⟩ is omitted, then it single-steps from +the current breakpoint. ``:steplocal`` and ``:stepmodule`` work +similarly. + +The ``:list`` command is particularly useful when single-stepping, to +see where you currently are: + +:: + + [qsort.hs:5:7-47] *Main> :list + 4 + 5 main = print (qsort [8, 4, 0, 3, 1, 23, 11, 18]) + 6 + [qsort.hs:5:7-47] *Main> + +In fact, GHCi provides a way to run a command when a breakpoint is hit, +so we can make it automatically do ``:list``: + +:: + + [qsort.hs:5:7-47] *Main> :set stop :list + [qsort.hs:5:7-47] *Main> :step + Stopped at qsort.hs:5:14-46 + _result :: [Integer] + 4 + 5 main = print (qsort [8, 4, 0, 3, 1, 23, 11, 18]) + 6 + [qsort.hs:5:14-46] *Main> + +.. _nested-breakpoints: + +Nested breakpoints +~~~~~~~~~~~~~~~~~~ + +When GHCi is stopped at a breakpoint, and an expression entered at the +prompt triggers a second breakpoint, the new breakpoint becomes the +"current" one, and the old one is saved on a stack. An arbitrary number +of breakpoint contexts can be built up in this way. For example: + +:: + + [qsort.hs:2:15-46] *Main> :st qsort [1,3] + Stopped at qsort.hs:(1,0)-(3,55) + _result :: [a] + ... [qsort.hs:(1,0)-(3,55)] *Main> + +While stopped at the breakpoint on line 2 that we set earlier, we +started a new evaluation with ``:step qsort [1,3]``. This new evaluation +stopped after one step (at the definition of ``qsort``). The prompt has +changed, now prefixed with ``...``, to indicate that there are saved +breakpoints beyond the current one. To see the stack of contexts, use +``:show context``: + +:: + + ... [qsort.hs:(1,0)-(3,55)] *Main> :show context + --> main + Stopped at qsort.hs:2:15-46 + --> qsort [1,3] + Stopped at qsort.hs:(1,0)-(3,55) + ... [qsort.hs:(1,0)-(3,55)] *Main> + +To abandon the current evaluation, use ``:abandon``: + +:: + + ... [qsort.hs:(1,0)-(3,55)] *Main> :abandon + [qsort.hs:2:15-46] *Main> :abandon + *Main> + +.. _ghci-debugger-result: + +The ``_result`` variable +~~~~~~~~~~~~~~~~~~~~~~~~ + +When stopped at a breakpoint or single-step, GHCi binds the variable +``_result`` to the value of the currently active expression. The value +of ``_result`` is presumably not available yet, because we stopped its +evaluation, but it can be forced: if the type is known and showable, +then just entering ``_result`` at the prompt will show it. However, +there's one caveat to doing this: evaluating ``_result`` will be likely +to trigger further breakpoints, starting with the breakpoint we are +currently stopped at (if we stopped at a real breakpoint, rather than +due to ``:step``). So it will probably be necessary to issue a +``:continue`` immediately when evaluating ``_result``. Alternatively, +you can use ``:force`` which ignores breakpoints. + +.. _tracing: + +Tracing and history +~~~~~~~~~~~~~~~~~~~ + +A question that we often want to ask when debugging a program is “how +did I get here?”. Traditional imperative debuggers usually provide some +kind of stack-tracing feature that lets you see the stack of active +function calls (sometimes called the “lexical call stack”), describing a +path through the code to the current location. Unfortunately this is +hard to provide in Haskell, because execution proceeds on a +demand-driven basis, rather than a depth-first basis as in strict +languages. The “stack“ in GHC's execution engine bears little +resemblance to the lexical call stack. Ideally GHCi would maintain a +separate lexical call stack in addition to the dynamic call stack, and +in fact this is exactly what our profiling system does +(:ref:`profiling`), and what some other Haskell debuggers do. For the +time being, however, GHCi doesn't maintain a lexical call stack (there +are some technical challenges to be overcome). Instead, we provide a way +to backtrack from a breakpoint to previous evaluation steps: essentially +this is like single-stepping backwards, and should in many cases provide +enough information to answer the "how did I get here?" question. + +To use tracing, evaluate an expression with the ``:trace`` command. For +example, if we set a breakpoint on the base case of ``qsort``: + +:: + + *Main> :list qsort + 1 qsort [] = [] + 2 qsort (a:as) = qsort left ++ [a] ++ qsort right + 3 where (left,right) = (filter (<=a) as, filter (>a) as) + 4 + *Main> :b 1 + Breakpoint 1 activated at qsort.hs:1:11-12 + *Main> + +and then run a small ``qsort`` with tracing: + +:: + + *Main> :trace qsort [3,2,1] + Stopped at qsort.hs:1:11-12 + _result :: [a] + [qsort.hs:1:11-12] *Main> + +We can now inspect the history of evaluation steps: + +:: + + [qsort.hs:1:11-12] *Main> :hist + -1 : qsort.hs:3:24-38 + -2 : qsort.hs:3:23-55 + -3 : qsort.hs:(1,0)-(3,55) + -4 : qsort.hs:2:15-24 + -5 : qsort.hs:2:15-46 + -6 : qsort.hs:3:24-38 + -7 : qsort.hs:3:23-55 + -8 : qsort.hs:(1,0)-(3,55) + -9 : qsort.hs:2:15-24 + -10 : qsort.hs:2:15-46 + -11 : qsort.hs:3:24-38 + -12 : qsort.hs:3:23-55 + -13 : qsort.hs:(1,0)-(3,55) + -14 : qsort.hs:2:15-24 + -15 : qsort.hs:2:15-46 + -16 : qsort.hs:(1,0)-(3,55) + <end of history> + +To examine one of the steps in the history, use ``:back``: + +:: + + [qsort.hs:1:11-12] *Main> :back + Logged breakpoint at qsort.hs:3:24-38 + _result :: [a] + as :: [a] + a :: a + [-1: qsort.hs:3:24-38] *Main> + +Note that the local variables at each step in the history have been +preserved, and can be examined as usual. Also note that the prompt has +changed to indicate that we're currently examining the first step in the +history: ``-1``. The command ``:forward`` can be used to traverse +forward in the history. + +The ``:trace`` command can be used with or without an expression. When +used without an expression, tracing begins from the current breakpoint, +just like ``:step``. + +The history is only available when using ``:trace``; the reason for this +is we found that logging each breakpoint in the history cuts performance +by a factor of 2 or more. By default, GHCi remembers the last 50 steps +in the history, but this can be changed with the ``-fghci-hist-size=n`` option). + +.. index:: + single: -fghci-hist-size + +.. _ghci-debugger-exceptions: + +Debugging exceptions +~~~~~~~~~~~~~~~~~~~~ + +Another common question that comes up when debugging is "where did this +exception come from?". Exceptions such as those raised by ``error`` or +``head []`` have no context information attached to them. Finding which +particular call to ``head`` in your program resulted in the error can be +a painstaking process, usually involving ``Debug.Trace.trace``, or +compiling with profiling and using ``Debug.Trace.traceStack`` or +``+RTS -xc`` (see :ref:`prof-time-options`). + +The GHCi debugger offers a way to hopefully shed some light on these +errors quickly and without modifying or recompiling the source code. One +way would be to set a breakpoint on the location in the source code that +throws the exception, and then use ``:trace`` and ``:history`` to +establish the context. However, ``head`` is in a library and we can't +set a breakpoint on it directly. For this reason, GHCi provides the +flags ``-fbreak-on-exception`` which causes the evaluator to stop when +an exception is thrown, and ``-fbreak-on-error``, which works similarly +but stops only on uncaught exceptions. When stopping at an exception, +GHCi will act just as it does when a breakpoint is hit, with the +deviation that it will not show you any source code location. Due to +this, these commands are only really useful in conjunction with +``:trace``, in order to log the steps leading up to the exception. For +example: + +:: + + *Main> :set -fbreak-on-exception + *Main> :trace qsort ("abc" ++ undefined) + “Stopped at <exception thrown> + _exception :: e + [<exception thrown>] *Main> :hist + -1 : qsort.hs:3:24-38 + -2 : qsort.hs:3:23-55 + -3 : qsort.hs:(1,0)-(3,55) + -4 : qsort.hs:2:15-24 + -5 : qsort.hs:2:15-46 + -6 : qsort.hs:(1,0)-(3,55) + <end of history> + [<exception thrown>] *Main> :back + Logged breakpoint at qsort.hs:3:24-38 + _result :: [a] + as :: [a] + a :: a + [-1: qsort.hs:3:24-38] *Main> :force as + *** Exception: Prelude.undefined + [-1: qsort.hs:3:24-38] *Main> :print as + as = 'b' : 'c' : (_t1::[Char]) + +The exception itself is bound to a new variable, ``_exception``. + +Breaking on exceptions is particularly useful for finding out what your +program was doing when it was in an infinite loop. Just hit Control-C, +and examine the history to find out what was going on. + +Example: inspecting functions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It is possible to use the debugger to examine function values. When we +are at a breakpoint and a function is in scope, the debugger cannot show +you the source code for it; however, it is possible to get some +information by applying it to some arguments and observing the result. + +The process is slightly complicated when the binding is polymorphic. We +show the process by means of an example. To keep things simple, we will +use the well known ``map`` function: + +:: + + import Prelude hiding (map) + + map :: (a->b) -> [a] -> [b] + map f [] = [] + map f (x:xs) = f x : map f xs + +We set a breakpoint on ``map``, and call it. + +:: + + *Main> :break 5 + Breakpoint 0 activated at map.hs:5:15-28 + *Main> map Just [1..5] + Stopped at map.hs:(4,0)-(5,12) + _result :: [b] + x :: a + f :: a -> b + xs :: [a] + +GHCi tells us that, among other bindings, ``f`` is in scope. However, +its type is not fully known yet, and thus it is not possible to apply it +to any arguments. Nevertheless, observe that the type of its first +argument is the same as the type of ``x``, and its result type is shared +with ``_result``. + +As we demonstrated earlier (:ref:`breakpoints`), the debugger has some +intelligence built-in to update the type of ``f`` whenever the types of +``x`` or ``_result`` are discovered. So what we do in this scenario is +force ``x`` a bit, in order to recover both its type and the argument +part of ``f``. + +:: + + *Main> seq x () + *Main> :print x + x = 1 + +We can check now that as expected, the type of ``x`` has been +reconstructed, and with it the type of ``f`` has been too: + +:: + + *Main> :t x + x :: Integer + *Main> :t f + f :: Integer -> b + +From here, we can apply f to any argument of type Integer and observe +the results. + +:: + + *Main> let b = f 10 + *Main> :t b + b :: b + *Main> b + <interactive>:1:0: + Ambiguous type variable `b' in the constraint: + `Show b' arising from a use of `print' at <interactive>:1:0 + *Main> :p b + b = (_t2::a) + *Main> seq b () + () + *Main> :t b + b :: a + *Main> :p b + b = Just 10 + *Main> :t b + b :: Maybe Integer + *Main> :t f + f :: Integer -> Maybe Integer + *Main> f 20 + Just 20 + *Main> map f [1..5] + [Just 1, Just 2, Just 3, Just 4, Just 5] + +In the first application of ``f``, we had to do some more type +reconstruction in order to recover the result type of ``f``. But after +that, we are free to use ``f`` normally. + +Limitations +~~~~~~~~~~~ + +- When stopped at a breakpoint, if you try to evaluate a variable that + is already under evaluation, the second evaluation will hang. The + reason is that GHC knows the variable is under evaluation, so the new + evaluation just waits for the result before continuing, but of course + this isn't going to happen because the first evaluation is stopped at + a breakpoint. Control-C can interrupt the hung evaluation and return + to the prompt. + + The most common way this can happen is when you're evaluating a CAF + (e.g. main), stop at a breakpoint, and ask for the value of the CAF + at the prompt again. + +- Implicit parameters (see :ref:`implicit-parameters`) are only + available at the scope of a breakpoint if there is an explicit type + signature. + +.. _ghci-invocation: + +Invoking GHCi +------------- + +.. index:: + single: invoking; GHCi + single: --interactive + +GHCi is invoked with the command ``ghci`` or ``ghc --interactive``. One +or more modules or filenames can also be specified on the command line; +this instructs GHCi to load the specified modules or filenames (and all +the modules they depend on), just as if you had said ``:load modules`` +at the GHCi prompt (see :ref:`ghci-commands`). For example, to start +GHCi and load the program whose topmost module is in the file +``Main.hs``, we could say: + +:: + + $ ghci Main.hs + +Most of the command-line options accepted by GHC (see :ref:`using-ghc`) +also make sense in interactive mode. The ones that don't make sense are +mostly obvious. + +Packages +~~~~~~~~ + +.. index:: + single: packages; with GHCi + +Most packages (see :ref:`using-packages`) are available without needing +to specify any extra flags at all: they will be automatically loaded the +first time they are needed. + +For hidden packages, however, you need to request the package be loaded +by using the ``-package`` flag: + +:: + + $ ghci -package readline + GHCi, version 6.8.1: http://www.haskell.org/ghc/ :? for help + Loading package base ... linking ... done. + Loading package readline-1.0 ... linking ... done. + Prelude> + +The following command works to load new packages into a running GHCi: + +:: + + Prelude> :set -package name + +But note that doing this will cause all currently loaded modules to be +unloaded, and you'll be dumped back into the ``Prelude``. + +Extra libraries +~~~~~~~~~~~~~~~ + +.. index:: + single: libraries; with GHCi + +Extra libraries may be specified on the command line using the normal +``-llib`` option. (The term *library* here refers to libraries of +foreign object code; for using libraries of Haskell source code, see +:ref:`ghci-modules-filenames`.) For example, to load the “m” library: + +:: + + $ ghci -lm + +On systems with ``.so``-style shared libraries, the actual library +loaded will the ``liblib.so``. GHCi searches the following places for +libraries, in this order: + +- Paths specified using the ``-Lpath`` command-line option, + +- the standard library search path for your system, which on some + systems may be overridden by setting the ``LD_LIBRARY_PATH`` + environment variable. + +On systems with ``.dll``-style shared libraries, the actual library +loaded will be ``lib.dll``. Again, GHCi will signal an error if it can't +find the library. + +GHCi can also load plain object files (``.o`` or ``.obj`` depending on +your platform) from the command-line. Just add the name the object file +to the command line. + +Ordering of ``-l`` options matters: a library should be mentioned +*before* the libraries it depends on (see :ref:`options-linker`). + +.. _ghci-commands: + +GHCi commands +------------- + +GHCi commands all begin with "``:``" and consist of a single command +name followed by zero or more parameters. The command name may be +abbreviated, with ambiguities being resolved in favour of the more +commonly used commands. + +``:abandon`` + .. index:: + single: :abandon + + Abandons the current evaluation (only available when stopped at a + breakpoint). + +``:add[*] ⟨module⟩`` + .. index:: + single: :add + + Add ⟨module⟩(s) to the current target set, and perform a reload. + Normally pre-compiled code for the module will be loaded if + available, or otherwise the module will be compiled to byte-code. + Using the ``*`` prefix forces the module to be loaded as byte-code. + +``:back ⟨n⟩`` + .. index:: + single: :back + + Travel back ⟨n⟩ steps in the history. ⟨n⟩ is one if omitted. See + :ref:`tracing` for more about GHCi's debugging facilities. See also: + ``:trace``, ``:history``, ``:forward``. + +``:break [⟨identifier⟩ | [⟨module⟩] ⟨line⟩ [⟨column⟩]]`` + .. index:: + single: :break + + Set a breakpoint on the specified function or line and column. See + :ref:`setting-breakpoints`. + +``:browse[!] [[*] ⟨module⟩]`` + .. index:: + single: :browse + + Displays the identifiers exported by the module ⟨module⟩, which must + be either loaded into GHCi or be a member of a package. If ⟨module⟩ + is omitted, the most recently-loaded module is used. + + Like all other GHCi commands, the output is always displayed in the + current GHCi scope (:ref:`ghci-scope`). + + There are two variants of the browse command: + + - If the ``*`` symbol is placed before the module name, then *all* + the identifiers in scope in ⟨module⟩ (rather that just its + exports) are shown. + + The ``*``-form is only available for modules which are + interpreted; for compiled modules (including modules from + packages) only the non-\ ``*`` form of ``:browse`` is available. + + - Data constructors and class methods are usually displayed in the + context of their data type or class declaration. However, if the + ``!`` symbol is appended to the command, thus ``:browse!``, they + are listed individually. The ``!``-form also annotates the + listing with comments giving possible imports for each group of + entries. Here is an example: + + :: + + Prelude> :browse! Data.Maybe + -- not currently imported + Data.Maybe.catMaybes :: [Maybe a] -> [a] + Data.Maybe.fromJust :: Maybe a -> a + Data.Maybe.fromMaybe :: a -> Maybe a -> a + Data.Maybe.isJust :: Maybe a -> Bool + Data.Maybe.isNothing :: Maybe a -> Bool + Data.Maybe.listToMaybe :: [a] -> Maybe a + Data.Maybe.mapMaybe :: (a -> Maybe b) -> [a] -> [b] + Data.Maybe.maybeToList :: Maybe a -> [a] + -- imported via Prelude + Just :: a -> Maybe a + data Maybe a = Nothing | Just a + Nothing :: Maybe a + maybe :: b -> (a -> b) -> Maybe a -> b + + This output shows that, in the context of the current session (ie + in the scope of ``Prelude``), the first group of items from + ``Data.Maybe`` are not in scope (althought they are available in + fully qualified form in the GHCi session - see + :ref:`ghci-scope`), whereas the second group of items are in + scope (via ``Prelude``) and are therefore available either + unqualified, or with a ``Prelude.`` qualifier. + +``:cd ⟨dir⟩`` + .. index:: + single: :cd + + Changes the current working directory to ⟨dir⟩. A "``~``" symbol + at the beginning of ⟨dir⟩ will be replaced by the contents of the + environment variable ``HOME``. See also the ``:show paths`` command + for showing the current working directory. + + 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. + +``:cmd ⟨expr⟩`` + .. index:: + single: :cmd + + Executes ⟨expr⟩ as a computation of type ``IO String``, and then + executes the resulting string as a list of GHCi commands. Multiple + commands are separated by newlines. The ``:cmd`` command is useful + with ``:def`` and ``:set stop``. + +``:complete ⟨type⟩ [⟨n⟩-][⟨m⟩] ⟨string-literal⟩`` + .. index:: + single: :complete + + This command allows to request command completions from GHCi even + when interacting over a pipe instead of a proper terminal and is + designed for integrating GHCi's completion with text editors and + IDEs. + + When called, ``:complete`` prints the ⟨n⟩\ :sup:`th` to + ⟨m⟩\ :sup:`th` completion candidates for the partial input + ⟨string-literal⟩ for the completion domain denoted by ⟨type⟩. + Currently, only the ``repl`` domain is supported which denotes the + kind of completion that would be provided interactively by GHCi at + the input prompt. + + If omitted, ⟨n⟩ and ⟨m⟩ default to the first or last available + completion candidate respectively. If there are less candidates than + requested via the range argument, ⟨n⟩ and ⟨m⟩ are implicitly capped + to the number of available completition candidates. + + The output of ``:complete`` begins with a header line containing + three space-delimited fields: + + - An integer denoting the number ``l`` of printed completions, + - an integer denoting the total number of completions available, + and finally + - a string literal denoting a common prefix to be added to the + returned completion candidates. + + The header line is followed by ⟨l⟩ lines each containing one + completion candidate encoded as (quoted) string literal. Here are + some example invocations showing the various cases: + + :: + + Prelude> :complete repl 0 "" + 0 470 "" + Prelude> :complete repl 5 "import For" + 5 21 "import " + "Foreign" + "Foreign.C" + "Foreign.C.Error" + "Foreign.C.String" + "Foreign.C.Types" + Prelude> :complete repl 5-10 "import For" + 6 21 "import " + "Foreign.C.Types" + "Foreign.Concurrent" + "Foreign.ForeignPtr" + "Foreign.ForeignPtr.Safe" + "Foreign.ForeignPtr.Unsafe" + "Foreign.Marshal" + Prelude> :complete repl 20- "import For" + 2 21 "import " + "Foreign.StablePtr" + "Foreign.Storable" + Prelude> :complete repl "map" + 3 3 "" + "map" + "mapM" + "mapM_" + Prelude> :complete repl 5-10 "map" + 0 3 "" + +``:continue`` + .. index:: + single: :continue + + Continue the current evaluation, when stopped at a breakpoint. + +``:ctags [⟨filename⟩]``, ``:etags [⟨filename⟩]`` + .. index:: + single: :ctags + single: :etags + + Generates a “tags” file for Vi-style editors (``:ctags``) or + Emacs-style editors (``:etags``). If no filename is specified, the + default ``tags`` or ``TAGS`` is used, respectively. Tags for all the + functions, constructors and types in the currently loaded modules + are created. All modules must be interpreted for these commands to + work. + +``:def! ⟨name⟩ ⟨expr⟩`` + .. index:: + single: :def + + ``:def`` is used to define new commands, or macros, in GHCi. The + command ``:def`` ⟨name⟩ ⟨expr⟩ defines a new GHCi command ``:name``, + implemented by the Haskell expression ⟨expr⟩, which must have type + ``String -> IO String``. When ``:name args`` is typed at the prompt, + GHCi will run the expression ``(name args)``, take the resulting + ``String``, and feed it back into GHCi as a new sequence of + commands. Separate commands in the result must be separated by + "``\n``". + + 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: + + :: + + Prelude> let date _ = Time.getClockTime >>= print >> return "" + Prelude> :def date date + Prelude> :date + Fri Mar 23 15:16:40 GMT 2001 + + Here's an example of a command that takes an argument. It's a + re-implementation of ``:cd``: + + :: + + Prelude> let mycd d = Directory.setCurrentDirectory d >> return "" + Prelude> :def mycd mycd + Prelude> :mycd .. + + Or I could define a simple way to invoke "``ghc --make Main``" + in the current directory: + + :: + + Prelude> :def make (\_ -> return ":! ghc --make Main") + + We can define a command that reads GHCi input from a file. This + might be useful for creating a set of bindings that we want to + repeatedly load into the GHCi session: + + :: + + Prelude> :def . readFile + Prelude> :. cmds.ghci + + Notice that we named the command ``:.``, by analogy with the + "``.``" Unix shell command that does the same thing. + + Typing ``:def`` on its own lists the currently-defined macros. + Attempting to redefine an existing command name results in an error + unless the ``:def!`` form is used, in which case the old command + with that name is silently overwritten. + +``:delete * | ⟨num⟩ ...`` + .. index:: + single: :delete + + Delete one or more breakpoints by number (use ``:show breaks`` to + see the number of each breakpoint). The ``*`` form deletes all the + breakpoints. + +``:edit ⟨file⟩`` + .. index:: + single: :edit + + Opens an editor to edit the file ⟨file⟩, or the most recently loaded + module if ⟨file⟩ is omitted. If there were errors during the last + loading, the cursor will be positioned at the line of the first + error. The editor to invoke is taken from the ``EDITOR`` environment + variable, or a default editor on your system if ``EDITOR`` is not + set. You can change the editor using ``:set editor``. + +``:etags`` + See ``:ctags``. + +``:force ⟨identifier⟩ ...`` + .. index:: + single: :force + + Prints the value of ⟨identifier⟩ in the same way as ``:print``. + Unlike ``:print``, ``:force`` evaluates each thunk that it + encounters while traversing the value. This may cause exceptions or + infinite loops, or further breakpoints (which are ignored, but + displayed). + +``:forward ⟨n⟩`` + .. index:: + single: :forward + + Move forward ⟨n⟩ steps in the history. ⟨n⟩ is one if omitted. See + :ref:`tracing` for more about GHCi's debugging facilities. See also: + ``:trace``, ``:history``, ``:back``. + +``:help``, ``:?`` + .. index:: + single: :help + single: :? + + Displays a list of the available commands. + +``:`` + .. index:: + single: : + + Repeat the previous command. + +``:history [num]`` + .. index:: + single: :history + + Display the history of evaluation steps. With a number, displays + that many steps (default: 20). For use with ``:trace``; see + :ref:`tracing`. To set the number of history entries stored by GHCi, + use ``-fghci-hist-size=n``. + +``:info[!] ⟨name⟩`` + .. index:: + single: :info + + Displays information about the given name(s). For example, if ⟨name⟩ + is a class, then the class methods and their types will be printed; + if ⟨name⟩ is a type constructor, then its definition will be + printed; if ⟨name⟩ is a function, then its type will be printed. If + ⟨name⟩ has been loaded from a source file, then GHCi will also + display the location of its definition in the source. + + For types and classes, GHCi also summarises instances that mention + them. To avoid showing irrelevant information, an instance is shown + only if (a) its head mentions ⟨name⟩, and (b) all the other things + mentioned in the instance are in scope (either qualified or + otherwise) as a result of a ``:load`` or ``:module`` commands. + + The command ``:info!`` works in a similar fashion but it removes + restriction (b), showing all instances that are in scope and mention + ⟨name⟩ in their head. + +``:issafe [⟨module⟩]`` + .. index:: + single: :issafe + + Displays Safe Haskell information about the given module (or the + current module if omitted). This includes the trust type of the + module and its containing package. + +``:kind[!] ⟨type⟩`` + .. index:: + single: :kind + + Infers and prints the kind of ⟨type⟩. The latter can be an arbitrary + type expression, including a partial application of a type + constructor, such as ``Either Int``. In fact, ``:kind`` even allows + you to write a partial application of a type synonym (usually + disallowed), so that this works: + + :: + + ghci> type T a b = (a,b,a) + ghci> :k T Int Bool + T Int Bool :: * + ghci> :k T + T :: * -> * -> * + ghci> :k T Int + T Int :: * -> * + + If you specify the optional "``!``", GHC will in addition normalise + the type by expanding out type synonyms and evaluating type-function + applications, and display the normalised result. + +``:list ⟨identifier⟩`` + .. index:: + single: :list + + Lists the source code around the definition of ⟨identifier⟩ or the + current breakpoint if not given. This requires that the identifier + be defined in an interpreted module. If your output device supports + it, then GHCi will highlight the active subexpression in bold. + +``:list [⟨module⟩] ⟨line⟩`` + .. index:: + single: :list + + Lists the source code around the given line number of ⟨module⟩. This + requires that the module be interpreted. If your output device + supports it, then GHCi will highlight the active subexpression in + bold. + +``:load[!] [*]⟨module⟩`` + .. index:: + single: :load + + Recursively loads the specified ⟨module⟩s, and all the modules they + depend on. Here, each ⟨module⟩ must be a module name or filename, + but may not be the name of a module in a package. + + All previously loaded modules, except package modules, are + forgotten. The new set of modules is known as the target set. Note + that ``:load`` can be used without any arguments to unload all the + currently loaded modules and bindings. + + Normally pre-compiled code for a module will be loaded if available, + or otherwise the module will be compiled to byte-code. Using the + ``*`` prefix forces a module to be loaded as byte-code. + + Adding the optional "``!``" turns type errors into warnings while + loading. This allows to use the portions of the module that are + correct, even if there are type errors in some definitions. + Effectively, the "-fdefer-type-errors" flag is set before loading + and unset after loading if the flag has not already been set before. + See :ref:`defer-type-errors` for further motivation and details. + + After a ``:load`` command, the current context is set to: + + - ⟨module⟩, if it was loaded successfully, or + + - the most recently successfully loaded module, if any other + modules were loaded as a result of the current ``:load``, or + + - ``Prelude`` otherwise. + +``:main ⟨arg1⟩ ... ⟨argn⟩`` + .. index:: + single: :main + + When a program is compiled and executed, it can use the ``getArgs`` + function to access the command-line arguments. However, we cannot + simply pass the arguments to the ``main`` function while we are + testing in ghci, as the ``main`` function doesn't take its arguments + directly. + + Instead, we can use the ``:main`` command. This runs whatever + ``main`` is in scope, with any arguments being treated the same as + command-line arguments, e.g.: + + :: + + Prelude> let main = System.Environment.getArgs >>= print + Prelude> :main foo bar + ["foo","bar"] + + We can also quote arguments which contains characters like spaces, + and they are treated like Haskell strings, or we can just use + Haskell list syntax: + + :: + + Prelude> :main foo "bar baz" + ["foo","bar baz"] + Prelude> :main ["foo", "bar baz"] + ["foo","bar baz"] + + Finally, other functions can be called, either with the ``-main-is`` + flag or the ``:run`` command: + + :: + + Prelude> let foo = putStrLn "foo" >> System.Environment.getArgs >>= print + Prelude> let bar = putStrLn "bar" >> System.Environment.getArgs >>= print + Prelude> :set -main-is foo + Prelude> :main foo "bar baz" + foo + ["foo","bar baz"] + Prelude> :run bar ["foo", "bar baz"] + bar + ["foo","bar baz"] + +``:module +|- [*]⟨mod1⟩ ...``, ``import mod`` + .. index:: + single: :module + + Sets or modifies the current context for statements typed at the + prompt. The form ``import mod`` is equivalent to ``:module +mod``. + See :ref:`ghci-scope` for more details. + +``:print ⟨names⟩`` + .. index:: + single: :print + + Prints a value without forcing its evaluation. ``:print`` may be + used on values whose types are unknown or partially known, which + might be the case for local variables with polymorphic types at a + breakpoint. While inspecting the runtime value, ``:print`` attempts + to reconstruct the type of the value, and will elaborate the type in + GHCi's environment if possible. If any unevaluated components + (thunks) are encountered, then ``:print`` binds a fresh variable + with a name beginning with ``_t`` to each thunk. See + :ref:`breakpoints` for more information. See also the ``:sprint`` + command, which works like ``:print`` but does not bind new + variables. + +``:quit`` + .. index:: + single: :quit + + Quits GHCi. You can also quit by typing control-D at the prompt. + +``:reload[!]`` + .. index:: + single: :reload + + Attempts to reload the current target set (see ``:load``) if any of + the modules in the set, or any dependent module, has changed. Note + that this may entail loading new modules, or dropping modules which + are no longer indirectly required by the target. + + Adding the optional "``!``" turns type errors into warnings while + loading. This allows to use the portions of the module that are + correct, even if there are type errors in some definitions. + Effectively, the "-fdefer-type-errors" flag is set before loading + and unset after loading if the flag has not already been set before. + See :ref:`defer-type-errors` for further motivation and details. + +``:run`` + .. index:: + single: :run + + See ``:main``. + +``:script [⟨n⟩] ⟨filename⟩`` + .. index:: + single: :script + + Executes the lines of a file as a series of GHCi commands. This + command is compatible with multiline statements as set by + ``:set +m`` + +``:set [⟨option⟩ ...]`` + .. index:: + single: :set + + Sets various options. See :ref:`ghci-set` for a list of available + options and :ref:`interactive-mode-options` for a list of + GHCi-specific flags. The ``:set`` command by itself shows which + options are currently set. It also lists the current dynamic flag + settings, with GHCi-specific flags listed separately. + +``:set args ⟨arg⟩`` + .. index:: + single: :set args + single: getArgs, behavior in GHCi + + Sets the list of arguments which are returned when the program calls + ``System.getArgs``. + +``:set editor ⟨cmd⟩`` + Sets the command used by ``:edit`` to ⟨cmd⟩. + +``:set prog ⟨prog⟩`` + .. index:: + single: :set prog + single: getProgName, behavior in GHCi + + Sets the string to be returned when the program calls + ``System.getProgName``. + +``:set prompt ⟨prompt⟩`` + .. index:: + single: GHCi prompt; setting + + Sets the string to be used as the prompt in GHCi. Inside ⟨prompt⟩, + the sequence ``%s`` is replaced by the names of the modules + currently in scope, ``%l`` is replaced by the line number (as + referenced in compiler messages) of the current prompt, and ``%%`` + is replaced by ``%``. If ⟨prompt⟩ starts with ``"`` then it is parsed as + a Haskell String; otherwise it is treated as a literal string. + +``:set prompt2 ⟨prompt⟩`` + Sets the string to be used as the continuation prompt (used when + using the ``:{`` command) in GHCi. + +``:set stop ⟨num⟩ ⟨cmd⟩`` + Set a command to be executed when a breakpoint is hit, or a new item + in the history is selected. The most common use of ``:set stop`` is + to display the source code at the current location, e.g. + ``:set stop :list``. + + If a number is given before the command, then the commands are run + when the specified breakpoint (only) is hit. This can be quite + useful: for example, ``:set stop 1 :continue`` effectively disables + breakpoint 1, by running ``:continue`` whenever it is hit (although + GHCi will still emit a message to say the breakpoint was hit). + What's more, with cunning use of ``:def`` and ``:cmd`` you can use + ``:set stop`` to implement conditional breakpoints: + + :: + + *Main> :def cond \expr -> return (":cmd if (" ++ expr ++ ") then return \"\" else return \":continue\"") + *Main> :set stop 0 :cond (x < 3) + + Ignoring breakpoints for a specified number of iterations is also + possible using similar techniques. + +``:seti [⟨option⟩ ...]`` + .. index:: + single: :seti + + Like ``:set``, but options set with ``:seti`` affect only + expressions and commands typed at the prompt, and not modules loaded + with ``:load`` (in contrast, options set with ``:set`` apply + everywhere). See :ref:`ghci-interactive-options`. + + Without any arguments, displays the current set of options that are + applied to expressions and commands typed at the prompt. + +``:show bindings`` + .. index:: + single: :show bindings + + Show the bindings made at the prompt and their types. + +``:show breaks`` + .. index:: + single: :show breaks + + List the active breakpoints. + +``:show context`` + .. index:: + single: :show context + + List the active evaluations that are stopped at breakpoints. + +``:show imports`` + .. index:: + single: :show imports + + Show the imports that are currently in force, as created by + ``import`` and ``:module`` commands. + +``:show modules`` + .. index:: + single: :show modules + + Show the list of modules currently loaded. + +``:show packages`` + .. index:: + single: :show packages + + Show the currently active package flags, as well as the list of + packages currently loaded. + +``:show paths`` + .. index:: + single: :show paths + + Show the current working directory (as set via ``:cd`` command), as + well as the list of directories searched for source files (as set by + the ``-i`` option). + +``:show language`` + .. index:: + single: :show language + + Show the currently active language flags for source files. + +``:showi language`` + .. index:: + single: :showi language + + Show the currently active language flags for expressions typed at + the prompt (see also ``:seti``). + +``:show [args|prog|prompt|editor|stop]`` + .. index:: + single: :show + + Displays the specified setting (see ``:set``). + +``:sprint`` + .. index:: + single: :sprint + + Prints a value without forcing its evaluation. ``:sprint`` is + similar to ``:print``, with the difference that unevaluated subterms + are not bound to new variables, they are simply denoted by ‘\_’. + +``:step [⟨expr⟩]`` + .. index:: + single: :step + + Enable all breakpoints and begin evaluating an expression in + single-stepping mode. In this mode evaluation will be stopped after + every reduction, allowing local variables to be inspected. If ⟨expr⟩ + is not given, evaluation will resume at the last breakpoint. See + :ref:`single-stepping`. + +``:steplocal`` + .. index:: + single: :steplocal + + Enable only breakpoints in the current top-level binding and resume + evaluation at the last breakpoint. + +``:stepmodule`` + .. index:: + single: :stepmodule + + Enable only breakpoints in the current module and resume evaluation + at the last breakpoint. + +``:trace expr`` + .. index:: + single: :trace + + Evaluates the given expression (or from the last breakpoint if no + expression is given), and additionally logs the evaluation steps for + later inspection using ``:history``. See :ref:`tracing`. + +``:type ⟨expression⟩`` + .. index:: + single: :type + + Infers and prints the type of ⟨expression⟩, including explicit + forall quantifiers for polymorphic types. The monomorphism + restriction is *not* applied to the expression during type + inference. + +``:undef ⟨name⟩`` + .. index:: + single: :undef + + Undefines the user-defined command ⟨name⟩ (see ``:def`` above). + +``:unset ⟨option⟩`` + .. index:: + single: :unset + + Unsets certain options. See :ref:`ghci-set` for a list of available + options. + +``:! ⟨command⟩`` + .. index:: + single: :! + single: shell commands; in GHCi + + Executes the shell command ⟨command⟩. + + +.. _ghci-set: + +The ``:set`` and ``:seti`` commands +----------------------------------- + +.. index:: + single: :set + single: :seti + +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. + +GHCi options +~~~~~~~~~~~~ + +.. index:: + single: options; GHCi + +GHCi options may be set using ``:set`` and unset using ``:unset``. + +The available GHCi options are: + +``+m`` + .. index:: + single: +m + + Enable parsing of multiline commands. A multiline command is + prompted for when the current input line contains open layout + contexts (see :ref:`ghci-multiline`). + +``+r`` + .. index:: + single: +r + single: CAFs; in GHCi + single: Constant Applicative Form + + 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`` + .. index:: + single: +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`` + .. index:: + single: +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``\ ’. + +.. _ghci-cmd-line-options: + +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 :ref:`flag-reference`), may be set using ``:set``. To unset an +option, you can set the reverse option: + +.. index:: + single: dynamic; options + +:: + + Prelude> :set -fno-warn-incomplete-patterns -XNoMultiParamTypeClasses + +:ref:`flag-reference` lists the reverse for each option where +applicable. + +Certain static options (``-package``, ``-I``, ``-i``, and ``-l`` in +particular) will also work, but some may not take effect until the next +reload. + +.. index:: + single: static; options + +.. _ghci-interactive-options: + +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: + +:: + + Prelude> :seti + base language is: Haskell2010 + with the following modifiers: + -XNoMonomorphismRestriction + -XNoDatatypeContexts + -XNondecreasingIndentation + -XExtendedDefaultRules + GHCi-specific dynamic flag settings: + other dynamic, non-language, flag settings: + -fimplicit-import-qualified + warning settings: + +The two sets of options are initialised as follows. First, both sets of +options are initialised as described in :ref:`ghci-dot-files`. Then the +interactive options are modified as follows: + +- The option ``-XExtendedDefaultRules`` is enabled, in order to apply + special defaulting rules to expressions typed at the prompt (see + :ref:`extended-default-rules`). + +- The Monomorphism Restriction is disabled (see :ref:`monomorphism`). + +.. _ghci-dot-files: + +The ``.ghci`` and ``.haskeline`` files +-------------------------------------- + +.. _dot-ghci-files: + +The ``.ghci`` files +~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: .ghci; file + single: startup; files, GHCi + +When it starts, unless the ``-ignore-dot-ghci`` flag is given, GHCi +reads and executes commands from the following files, in this order, if +they exist: + +1. ``./.ghci`` + +2. ``appdata/ghc/ghci.conf``, where ⟨appdata⟩ depends on your system, + but is usually something like + ``C:/Documents and Settings/user/Application Data`` + +3. On Unix: ``$HOME/.ghc/ghci.conf`` + +4. ``$HOME/.ghci`` + +The ``ghci.conf`` file is most useful for turning on favourite options +(eg. ``:set +s``), and defining useful macros. Note: when setting +language options in this file it is usually desirable to use ``:seti`` +rather than ``:set`` (see :ref:`ghci-interactive-options`). + +Placing a ``.ghci`` file in a directory with a Haskell project is a +useful way to set certain project-wide options so you don't have to type +them every time you start GHCi: eg. if your project uses multi-parameter +type classes, scoped type variables, and CPP, and has source files in +three subdirectories A, B and C, you might put the following lines in +``.ghci``: + +:: + + :set -XMultiParamTypeClasses -XScopedTypeVariables -cpp + :set -iA:B:C + +(Note that strictly speaking the ``-i`` flag is a static one, but in +fact it works to set it using ``:set`` like this. The changes won't take +effect until the next ``:load``, though.) + +Once you have a library of GHCi macros, you may want to source them from +separate files, or you may want to source your ``.ghci`` file into your +running GHCi session while debugging it + +:: + + :def source readFile + +With this macro defined in your ``.ghci`` file, you can use +``:source file`` to read GHCi commands from ``file``. You can find (and +contribute!-) other suggestions for ``.ghci`` files on this Haskell wiki +page: `GHC/GHCi <http://haskell.org/haskellwiki/GHC/GHCi>`__ + +Additionally, any files specified with ``-ghci-script`` flags will be +read after the standard files, allowing the use of custom .ghci files. + +Two command-line options control whether the startup files files are +read: + +``-ignore-dot-ghci`` + .. index:: + single: -ignore-dot-ghci + + Don't read either ``./.ghci`` or the other startup files when + starting up. + +``-ghci-script`` + .. index:: + single: -ghci-script + + Read a specific file after the usual startup files. Maybe be + specified repeatedly for multiple inputs. + +When defining GHCi macros, there is some important behavior you should +be aware of when names may conflict with built-in commands, especially +regarding tab completion. + +For example, consider if you had a macro named ``:time`` and in the +shell, typed ``:t 3`` - what should happen? The current algorithm we use +for completing commands is: + +1. First, look up an exact match on the name from the defined macros. + +2. Look for the exact match on the name in the built-in command list. + +3. Do a prefix lookup on the list of built-in commands - if a built-in + command matches, but a macro is defined with the same name as the + built-in defined, pick the macro. + +4. Do a prefix lookup on the list of built-in commands. + +5. Do a prefix lookup on the list of defined macros. + +Here are some examples: + +1. You have a macro ``:time`` and enter ``:t 3`` + + You get ``:type 3`` + +2. You have a macro ``:type`` and enter ``:t 3`` + + You get ``:type 3`` with your defined macro, not the builtin. + +3. You have a macro ``:time`` and a macro ``:type``, and enter ``:t 3`` + + You get ``:type 3`` with your defined macro. + +.. _dot-haskeline-file: + +The ``.haskeline`` file +~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: .haskeline; file + single: startup; files, GHCi + +GHCi uses `Haskeline <https://hackage.haskell.org/package/haskeline>`__ under +the hood. You can configure it to, among other +things, prune duplicates from GHCi history. See: +`Haskeline user preferences <http://trac.haskell.org/haskeline/wiki/UserPrefs>`__. + +.. _ghci-obj: + +Compiling to object code inside GHCi +------------------------------------ + +By default, GHCi compiles Haskell source code into byte-code that is +interpreted by the runtime system. GHCi can also compile Haskell code to +object code: to turn on this feature, use the ``-fobject-code`` flag +either on the command line or with ``:set`` (the option ``-fbyte-code`` +restores byte-code compilation again). Compiling to object code takes +longer, but typically the code will execute 10-20 times faster than +byte-code. + +Compiling to object code inside GHCi is particularly useful if you are +developing a compiled application, because the ``:reload`` command +typically runs much faster than restarting GHC with ``--make`` from the +command-line, because all the interface files are already cached in +memory. + +There are disadvantages to compiling to object-code: you can't set +breakpoints in object-code modules, for example. Only the exports of an +object-code module will be visible in GHCi, rather than all top-level +bindings as in interpreted modules. + +.. _ghci-faq: + +FAQ and Things To Watch Out For +------------------------------- + +The interpreter can't load modules with foreign export declarations! + Unfortunately not. We haven't implemented it yet. Please compile any + offending modules by hand before loading them into GHCi. + +``-O`` doesn't work with GHCi! + .. index:: + single: -O + + For technical reasons, the bytecode compiler doesn't interact well + with one of the optimisation passes, so we have disabled + optimisation when using the interpreter. This isn't a great loss: + you'll get a much bigger win by compiling the bits of your code that + need to go fast, rather than interpreting them with optimisation + turned on. + +Unboxed tuples don't work with GHCi + That's right. You can always compile a module that uses unboxed + tuples and load it into GHCi, however. (Incidentally the previous + point, namely that ``-O`` is incompatible with GHCi, is because the + bytecode compiler can't deal with unboxed tuples). + +Concurrent threads don't carry on running when GHCi is waiting for input. + This should work, as long as your GHCi was built with the + ``-threaded`` switch, which is the default. Consult whoever supplied + your GHCi installation. + + +After using ``getContents``, I can't use ``stdin``, until I do ``:load`` or ``:reload`` + This is the defined behaviour of ``getContents``: it puts the stdin + Handle in a state known as semi-closed, wherein any further I/O + operations on it are forbidden. Because I/O state is retained + between computations, the semi-closed state persists until the next + ``:load`` or ``:reload`` command. + + You can make ``stdin`` reset itself after every evaluation by giving + GHCi the command ``:set +r``. This works because ``stdin`` is just a + top-level expression that can be reverted to its unevaluated state + in the same way as any other top-level expression (CAF). + +I can't use Control-C to interrupt computations in GHCi on Windows. + See :ref:`ghci-windows`. + +The default buffering mode is different in GHCi to GHC. + In GHC, the stdout handle is line-buffered by default. However, in + GHCi we turn off the buffering on stdout, because this is normally + what you want in an interpreter: output appears as it is generated. + + If you want line-buffered behaviour, as in GHC, you can start your + program thus: + + :: + + main = do { hSetBuffering stdout LineBuffering; ... } + + +.. [5] + Note that packages only contain compiled code, so debugging a package + requires finding its source and loading that directly. + +.. [6] + We originally provided bindings for all variables in scope, rather + than just the free variables of the expression, but found that this + affected performance considerably, hence the current restriction to + just the free variables. |