有没有一个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