Есть ли форматер кода на Haskell? - PullRequest
41 голосов
/ 29 июля 2011

Раньше я писал

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

но теперь я предпочитаю

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

Я думаю, что ответ будет отрицательным, но я все равно спрашиваю: есть ли форматер кода для Haskell?

Ответы [ 4 ]

53 голосов
/ 29 июля 2011

Новый ответ

Я сейчас написал 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 для переформатирования каждый раз, когда вы нажимаете save или что-то еще.

11 голосов
/ 01 сентября 2012

Есть Stylish-Haskell , который может делать именно то, что вы хотите.

4 голосов
/ 12 августа 2011

Для этой же цели я написал небольшой скрипт: https://github.com/djv/small/blob/master/tidy.hs Я звоню из vim, чтобы переформатировать мой код.

2 голосов
/ 10 февраля 2014

Для печати 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
...