我曾经写过
data A = A {
a :: Double
}
deriving(Eq, Show)
但现在我更喜欢
data A = A {
a :: Double
} deriving(Eq, Show)
我认为答案是否定的,但无论如何我都会问:Haskell是否有代码格式化程序?
答案 0 :(得分:53)
我现在写了hindent,这是用haskell-src-exts写的。它有Emacs和Vim支持。
有haskell-src-exts将解析您的代码,它有一个漂亮的打印模块,用于将AST打印到字符串。 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)
示例:
λ> putStrLn $ codeFormat "module X where x = 1 where { y 1 = 2; y _ = 2 }"
module X where
x = 1
where y 1 = 2
y _ = 2
或者你可以自己写一个漂亮的打印机(如果你只是想要专业化的话,基于上面的那个),然后你可以拥有你想要的任何风格。将prettyPrint
替换为您自己的{{1}}。 AST很直接。
然后,您可以将其与Emacs连接,以便在每次点击保存或其他内容时重新格式化。
答案 1 :(得分:11)
stylish-haskell可以完全按照自己的意愿行事。
答案 2 :(得分:4)
我为同样的目的编写了一个小脚本:https://github.com/djv/small/blob/master/tidy.hs 我从vim调用它来重新格式化我的代码。
答案 3 :(得分:2)
要打印带有评论的AST,您需要ExactPrint
exactPrint :: ExactP ast => ast SrcSpanInfo -> [Comment] -> String
但exactPrint
不会打印您的来源。
我写过a small tool你可以用Vim作为外部格式化程序来调用它。
prettyHS :: String -> String
prettyHS src
= case parseFileContentsWithComments defaultParseMode src of
ParseOk (ast, _) -> prettyPrint ast
_ -> src