开发者

Is there a Haskell code formatter?

开发者 https://www.devze.com 2023-03-23 14:31 出处:网络
I used to write data A = A { a :: Double } deriving(Eq, Show) but now i prefer data 开发者_如何转开发A = A {

I used to write

data A = A {
      a :: Double
    }
    deriving(Eq, Show)

but now i prefer

data 开发者_如何转开发A = A {
      a :: Double
    } deriving(Eq, Show)

I think the answer will be no, but i ask anyway: is there a code formatter for Haskell?


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.


There's stylish-haskell which can do precisely what you want.


I've written a small script for that same purpose: https://github.com/djv/small/blob/master/tidy.hs I call it from vim to reformat my code.


To print an AST with comments you would need ExactPrint

exactPrint :: ExactP ast => ast SrcSpanInfo -> [Comment] -> String

but exactPrint won't pretty print your sources.

I've written a small tool you can call it with Vim as an external formatter.

prettyHS :: String -> String
prettyHS src
  = case parseFileContentsWithComments defaultParseMode src of
        ParseOk (ast, _) -> prettyPrint ast
        _ -> src
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号