I recently ran across something new to me: there’s no need to use
let in ghci since GHC 8.0.1 (which was released in 2016).
You can just type x = 7 directly! I’ve been typing
let every time for years…. This is a good opportunity to
provide a few tips and tricks that make using ghci a little nicer.
:load and :reload (along with their
shortened forms, :l and :r) load and reload
modules. One nice feature is :reload!, which reloads what
it can from a module (ignoring functions with type errors in their
signatures, for example). This is super useful when you’re in the middle
of writing a module and want to use part of it in ghci without having to
fix every compiler error first.
The :show, :browse, and :info
commands are useful for gaining information. :show provides
general information—use it to see what’s currently imported, or which
language extensions are in use. :show bindings gives the
current bindings in scope of this ghci session. :browse
lets you see what’s in a module. For example,
:browse Data.Maybe will list out the functions and data
constructors in the Data.Maybe module. :info
is useful for things are in scope. If you’ve imported
Data.Maybe, :info Maybe will show you the data
constructor and instances that Maybe has.
I also recommend hooking in hoogle by adding a line like
:def hoogle \x -> return $ ":!hoogle \"" ++ x ++ "\"" to
your .ghci dotfile.
Use :set +t to see the types of expressions
automatically. This can save you from having to type :t it
all the time.
If you’ve accidentally imported some module you’d like to remove from
scope, you can do so with :module -<module_name> For
example, :module -Data.List will get rid of
Data.List for you. This can help remove extra names that
are polluting your environment.
Multiline input with ghci is actually pretty nice. Use
:{ to begin a block and :} to close it. You
can also do :set +m if you’d like a multiline input mode
that’s automatically exited out of for you—just input a newline.
:set +m will apply to all future commands, so if you enter
lots of multiline commands you might consider leaving it on. You can
always turn it off with :set -m
Finally, use :main arg1 arg2 to run main
with arguments. You can also run other functions with specific
arguments. To run f with argument arg1, do the
command :run f arg1.