Подтвердить что ты не робот

Есть ли форматировщик кода Haskell?

Я писал

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

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

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

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

4b9b3361

Ответ 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 для переформатирования каждый раз, когда вы нажимаете "Сохранить" или что-то в этом роде.

Ответ 2

Там stylish-haskell, который может делать именно то, что вы хотите.

Ответ 4

Чтобы распечатать 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