Има ли програма за форматиране на код на 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
Няколко години закъснение, но hindent съществува сега, актуализирах отговора си за приемане с него.   -  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, за да преформатирате всеки път, когато натиснете Save или нещо подобно.

person Christopher Done    schedule 29.07.2011
comment
поставете това във вашия ~./ghci: :set промпт λ› - 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

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