Существует ли средство форматирования кода Haskell?

я писал

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

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

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

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


person LennyStackOverflow    schedule 29.07.2011    source источник
comment
С опозданием на несколько лет, но теперь он существует, я обновил свой ответ на него.   -  person Christopher Done    schedule 06.02.2015
comment
проверить Бретань   -  person Janus Troelsen    schedule 05.08.2017


Ответы (4)


Новый ответ

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

person Christopher Done    schedule 29.07.2011
comment
поместите это в свой ~./ghci: :set prompt λ› - person gawi; 03.08.2011
comment
Ваш код не проверяет тип с помощью haskell-src-exts-1.13.5. Кроме того, есть ли способ красиво напечатать его, включая комментарии? - person Joachim Breitner; 24.06.2013
comment
код может быть проверен на тип, если вы переключитесь на другую функцию синтаксического анализа, но, похоже, нет поддержки для сохранения комментариев в источнике, только сбор комментариев в список, не знаю, почему это полезно делать. - person Sawyer; 09.02.2014

Существует stylish-haskell, который может делать именно то, что вам нужно.

person user239558    schedule 01.09.2012

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

person Daniel    schedule 12.08.2011

Чтобы распечатать AST с комментариями, вам потребуется Точная печать

exactPrint :: ExactP ast => ast SrcSpanInfo -> [Comment] -> String

но exactPrint не будет печатать ваши источники.

Я написал небольшой инструмент, который вы можете вызывать с помощью Vim в качестве внешнего средства форматирования.

prettyHS :: String -> String
prettyHS src
  = case parseFileContentsWithComments defaultParseMode src of
        ParseOk (ast, _) -> prettyPrint ast
        _ -> src
person Zane XY    schedule 10.02.2014