有没有一个Haskell代码格式化程序?

我曾经写

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

但现在我更喜欢

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

我认为答案是否定的,但我仍然问:Haskell有一个代码格式化程序吗?

新的答案

我现在写了hindent ,这是用haskell-src- exts编写的。 它有Emacs和Vim的支持。


老答案

haskell-src-exts将parsing你的代码,它有一个漂亮的打印模块,用于将AST打印到一个string。 例如

 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) 

例:

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

或者,你可以自己写一个漂亮的打印机(即使基于上面的,如果你只是想专精),然后你可以有任何你想要的风格。 用你自己的replaceprettyPrint 。 AST是非常直接的。

然后你可以把它与Emacs挂钩重新格式化,每次你保存或什么的。

有时髦的哈斯克尔可以做你想要的。

我已经写了一个小脚本达到同样的目的: https : //github.com/djv/small/blob/master/tidy.hs我从vim调用它来重新格式化我的代码。

要打印带有注释的AST,您需要使用ExactPrint

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

exactPrint不会漂亮打印您的来源。

我写了一个小工具 ,可以用Vim作为外部格式化程序调用它。

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