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
.