Automatically Apply HLint Suggestions

Posted on November 22, 2015

Users upgrading to hlint 1.9.23 will now be able to take advantage of the new --refactor flag which by invoking the refactor executable supplied by apply-refact can automatically apply suggestions.


Getting Started

cabal install hlint
cabal install apply-refact
hlint --refactor myfile.hs

To take advantage of this flag users also need to install the refactor executable which is provided by apply-refact. Users can directly invoke refactor if they wish but it is easier to invoke it via hlint, passing any extra options with the --refactor-options flag.

HLint will by default apply all suggestions without any prompts to the user and output the result on stdout.


If you’re feeling cautious, the -s flag will prompt you before applying each refactoring.


If you’re feeling brave, the -i flag will perform the refactoring in place.


The final option which is useful for tool writers is the --pos flag which specifies the region to which hints should be applied to.


Editor Integration

There are plugins availible for vim, emacs and atom. Moritz Kiefer has already helped me with the emacs plugin, pull requests to clean up the other two plugins would be greatly appreciated.

Reporting Bugs

If you find that the program gives you an unexpected result then please report a bug to the issue tracker. Please also include the output of hlint --serialise and the input file.

There are a few known problems with CPP and a few corner cases which are not handled by the underlying library but for most users, a pain-free experience is expected.

Known Issues

  • Tabs and trailing whitespace will be removed (this is by design and not going to change). Line endings are changed to unix line endings.

  • Not all hlint suggestions are supported. A notable exception being the eta reduction refactoring as it proved quite difficult to implement correctly.

  • Sometimes hlint suggests a refactoring which uses a name which isn’t in scope. The tool is quite dumb! It just takes whatever hlint suggests and applies it blindly. It might be good to add an option to hlint to avoid spitting out hints which do this.