Installing Hoogle locally
The server at hoogle.haskell.org provides a version of Hoogle updated daily that searches all the packages available on Stackage. This document describes how to install and setup your own copy of Hoogle, which is useful if you want to search different packages, use the command line, or use Hoogle offline.
The first step is to obtain Hoogle, currently from the Git repo, then install it using
A Hoogle database is a prebuilt index of a set of packages. A database is a single binary file (usually with extension
.hoo) which is generated once then searched in a read-only manner. By default, Hoogle will generate the default database at
~/.hoogle/default.hoo, but this can be configured with the
--database flag. If you pass a custom
--database flag, make sure to pass a similar flag when running
The remainder of this document covers generating Hoogle databases, then searching Hoogle databases.
Generate a Hoogle database
There are several different use cases for generating databases. All ultimately take text files (usually with extension
.txt) which are a list of functions and their types, along with information about type synonyms, instances etc. The textual database files can be generated by Cabal with
cabal haddock --hoogle.
Index all of Stackage
hoogle generate to generate an index for the current version of Stackage LTS. This command downloads the necessary inputs from the web as required and caches them (in the same directory as the database). To force redownloading pass
--download. To demand no downloading, failing if the data cannot be found, pass
--download=no. Links to the results will point at Hackage.
Index specific packages
hoogle generate base filepath to generate an index for only the
filepath libraries. Using this command you can chose to index packages not in Stackage. Links to the results will point at Hackage.
Index all ghc-pkg installed packages
hoogle generate --local to query
ghc-pkg and generate links for all packages which have documentation and Hoogle input files generated. By editing your Cabal config file you can have Cabal automatically generate such files when packages are installed. Links to the results will point at your local file system.
Index a directory
hoogle generate --local=mydir to generate an index for the packages in
mydir, which must contain
foo.txt Hoogle input files. Links to the results will default to Hackage, but if
@url directives are in the
.txt files they can override the link destination.
Searching a Hoogle database
You can run searches on the command line or by spawning a web server.
Just be careful not to redirect your output by doing
a -> b and producing a file called
If your database points at the local file system pass
--local to reserve
file:// links over
http://, so the documentation works.
Old usage notes
Ever feel like having access to hoogle whilst messing around in GHCi? It's relatively easy to integrate the two.
The following will install hoogle as a shell command, and configure GHCi to have a command ":hoogle":
- cabal install hoogle
- echo >> ~/.ghci ':def hoogle \x -> return $ ":!hoogle " ++ x'
NB. the above wraps the argument in quotes before passing to the shell command, so there is no need to supply quotes; eg.
:hoogle map :hoogle (a -> b) -> [a] -> [b]
On Windows you should add the same line :def hoogle \x -> return $ ":!hoogle "" ++ x ++ """ to file (XP/2003): C:\Documents and Settings[your windows account]\Application Data\ghc\ghci.conf or(Windows Vista/7): C:\users[your windows account]\Application Data\ghc\ghci.conf
How it works
Next, we need to integrate it into GHCi. We can execute shell commands with GHCi via
:def. Load up GHCi, and type the following:
:def hoogle \x -> return $ ":!hoogle " ++ x
If this executes cleanly, you should be able to run hoogle commands from GHCi via
:hoogle map or
:hoogle "(a -> b) -> [a] -> [b]". Be careful: you need the extra quotes when hoogling types, at least on my system.
:ho works as an abbreviation of
:h clashes with
Finally, we want to make this persist across GHCi sessions. GHCi loads a file called ~/.ghci before running, so simply stick the above
:def in that file and all should work.
Contributed by [[User:DavidHouse|DavidHouse]]
[[Haskell_mode_for_Emacs|haskell-mode]] from versions 2.4 onwards have the function haskell-hoogle, which will hoogle the identifier at point. Setup:
(require 'haskell-mode) (define-key haskell-mode-map "\C-ch" 'haskell-hoogle) ;(setq haskell-hoogle-command "hoogle")
You will need a web browser configured for best results. Here's an example setup for Safari:
(setq browse-url-browser-function 'browse-url-safari) (defun browse-url-safari (url &optional new-window) "Open URL in a new Safari window." (interactive (browse-url-interactive-arg "URL: ")) (unless (string= "" (shell-command-to-string (concat "open -a Safari " url))) (message "Starting Safari...") (start-process (concat "open -a Safari " url) nil "open -a Safari " url) (message "Starting Safari... done")))
Alternately, you can build the command-line hoogle (darcs repo below) and uncomment the third line above, then results will appear in a buffer.