【问题标题】:Is there a Haskell code formatter?有没有 Haskell 代码格式化程序?
【发布时间】:2011-07-29 07:54:09
【问题描述】:

我曾经写过

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

但现在我更喜欢

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

我认为答案是否定的,但我还是问:有没有 Haskell 的代码格式化程序?

【问题讨论】:

  • 晚了几年但现在存在阻碍,我已经用它更新了我的接受答案。
  • 看看布列塔尼

标签: haskell code-formatting


【解决方案1】:

新答案

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


旧答案

haskell-src-exts 会解析您的代码,它有一个漂亮的打印模块,用于将 AST 打印到字符串。例如

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 替换为您自己的。 AST 非常简单。

然后您可以将它与 Emacs 连接,以便在您每次点击保存时重新格式化。

【讨论】:

  • 把这个放到你的 ~./ghci: :set prompt "λ>"
  • 您的代码没有使用 haskell-src-exts-1.13.5 进行类型检查。另外,有没有办法漂亮地打印它,包括 cmets?
  • 改成其他解析函数可以对代码进行类型检查,但是好像不支持在源中保留cmets,只将cmets收集到一个列表中,不知道为什么这样做很有用。
【解决方案2】:

stylish-haskell 可以完全满足您的需求。

【讨论】:

    【解决方案3】:

    我为此编写了一个小脚本:https://github.com/djv/small/blob/master/tidy.hs 我从 vim 调用它来重新格式化我的代码。

    【讨论】:

      【解决方案4】:

      要使用 cmets 打印 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
      

      【讨论】:

        猜你喜欢
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 2010-09-28
        • 2010-09-07
        • 2020-10-25
        相关资源
        最近更新 更多