New answer

I have now written hindent, which is written in terms of haskell-src-exts. It has Emacs and Vim support.

Old answer

There is haskell-src-exts which will parse your code and it has a pretty printing module for printing the AST to a string. E.g.

import Language.Haskell.Exts main = interact codeFormat codeFormat = check . fmap reformat . parseModuleWithComments where reformat = prettyPrint check r = case r of ParseOk a -> a ParseFailed loc err -> error $ show (loc,err)

Example:

λ> putStrLn $ codeFormat "module X where x = 1 where { y 1 = 2; y _ = 2 }" module X where x = 1 where y 1 = 2 y _ = 2

Alternatively you can write a pretty printer yourself (even based on the above if you just want to specialise), and then you can have whatever style you want. Replace prettyPrint with your own. The AST is very straight-forward.

Then you can hook it up with Emacs to reformat every time you hit save or something.