2011-07-29 55 views
38

我以前寫是否有Haskell代碼格式化程序?

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

,但現在我更喜歡

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

我認爲答案是否定的,但無論如何,我問:有沒有Haskell的代碼格式?

+0

幾年遲到但現在存在,我已經用它更新了我的接受答案。 –

+0

check out brittany –

回答

52

新的答案

我現在已經寫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把它與每次你保存或者其他東西時重新格式化。

+8

把這個放在你的〜。/ ghci::set prompt「λ>」 – gawi

+0

你的代碼沒有用haskell-src-exts-1.13.5進行類型檢查。另外,有沒有辦法將它打印出來,包括評論? –

+0

如果您更改爲其他解析函數,則可以對代碼進行類型檢查,但似乎沒有支持在源代碼中保留註釋,只將註釋收集到列表中,不知道爲什麼它有用。 – Sawyer

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