Skip to content


Subversion checkout URL

You can clone with
Download ZIP
The Haskell Refactoring Tool
Haskell TeX HTML Yacc Emacs Lisp Shell Other
#22 Compare This branch is even with RefactoringTools:master.
Failed to load latest commit information.
docker wip
docs Typo
elisp Merge pull request #33 from gracjan/pr-add-first-test-for-elisp
experiments Starting to integrate DualTree
hareview Capture latest hareview state, to clean up workspace
hcar Draft update for HCAR 2015-05
old Getting rid of some old files no longer needed.
src Work around GHC bug skipping pragmas after a comment
test Work around GHC bug skipping pragmas after a comment
.ghci MoveDef tests now pass
.gitignore Go back to straight ppa travis
.travis.yml Clean up .travis
ChangeLog Preparing for
GHC-NOTES Cleanup and introduce rdrName2Name
HaRe.cabal Preparing for
HaReLogo.svg Doc tweaks Setting lower bound on Diff dependency. Closes #7
LICENSE Update license
NOTES WIP. Working in the new ghc-mod. Incomplete. Preparing for
Setup.hs Adding files that are in the hackage HaRe- package, but not in…
TODO Remove trailing whitespace Update TODO WIP. Does not want to load files properly if not in project directory
cabal.config Adding stackage LTS-3.5 cabal.config rename refactor handles names in client modules Cleaning up Making progress. Comments missing from roundtrip Experimenting with docker
stack-travis.yaml Rework RefactGhc use of GhcModT
travis_long stack based travis build, with caching

HaRe : The Haskell Refactorer

Home is now

HaRe can rename symbols, lift definitions, convert equivalent Haskell constructs like ifs and cases and more while preserving program semantics, types and correctly handling indentation. Only HaRe can execute identity transformation!

Available on Hackage License BSD3 Build Status


  • GHC versions up to 7.6.3 are supported via HaRe version
  • GHC version 7.8.x is NOT supported, and never will be
  • GHC version 7.10.2 and up is supported for HaRe >=


HaRe will only work for projects using GHC 7.10.2 for compilation. Compiling HaRe with 7.10.2 and then using it against projects using an earlier compiler will not work, as HaRe needs to be able to invoke GHC to the type checker stage on the project using GHC 7.10.2.


Getting Started

cabal install HaRe

Check that it works from the command line

$ ghc-hare --version

Running the bare command lists available refactorings and their parameters

Emacs integration

Currently only emacs integration is offered. Add the following to your ~/.emacs using the load-path entry that matches the installation on your machine.

(add-to-load-path "~/.cabal/share/x86_64-linux-ghc-7.10.2/HaRe-")
(require 'hare)
(autoload 'hare-init "hare" nil t)

Add an intializer hook to the ghc-mode command

(add-hook 'haskell-mode-hook (lambda () (ghc-init) (hare-init)))

Alternatively, if using haskell-mode, and initializing via a function

;; Haskell main editing mode key bindings.
(defun haskell-hook ()

  ;(lambda nil (ghc-init))

If this is done correctly, there should be an additional Refactorer menu entry when opening a haskell file. The refactorings can be initiated via the menu, or using the keyboard shortcuts displayed in the menu.

The installation can be fine-tuned using

M-x customize-variable



Each refactoring will first ask for any information it requires, e.g. a new name if renaming, and then attempt the refactoring. If any precondition is not met this will be reported and the refactoring will abort.

If it succeeds, you will be given the option to look at an ediff session to see what changes would be made, and each file can be individually accepted or declined.

If the refactoring is commited, the original file is renamed to have a suffix containing the current timestamp.

E.g., after renaming in Foo.hs, there will be two files


This allows a sequence of refactorings to be undone manually if required. In theory.

Development & Support

Join in at #haskell-refactorer on freenode.

Note: (2015-10-04) HaRe cannot be tested using stack. It can be built, but the tests will fail, as HaRe makes use of ghc-mod as a library and the interaction between stack, ghc-mod and cabal-helper does not work for the tests.

Running test suite

To run the test suite do:

cabal test

The script simply makes sure that all the cabal projects used in the tests are also configured.

See for details on hspec

see for continuous build results


Coding style

Contributors: please try to follow Note:A consistent coding layout style is more important than what specific on is used.


  • Alan Zimmerman
  • Christopher Brown
  • Francisco Soares
  • Gracjan Polak
  • Harald Jagenteufel
  • Huiqing Li
  • Matthew Pickering
  • Simon Thompson

Please put a pull request for this list if you are missing.


The logo was designed by Christi du Toit,

Something went wrong with that request. Please try again.