是否有Haskell代码格式化程序?

时间:2011-07-29 07:54:09

标签: haskell code-formatting

我曾经写过

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

但现在我更喜欢

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

我认为答案是否定的,但无论如何我都会问:Haskell是否有代码格式化程序?

4 个答案:

答案 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