¿Hay un formateador de código Haskell?
code-formatting (4)
Nueva respuesta
Ahora he escrito " hindent , que está escrito en términos de haskell-src-exts . Tiene soporte Emacs y Vim.
Respuesta anterior
Hay haskell-src-exts que analizarán su código y tiene un bonito módulo de impresión para imprimir el AST en una cadena. P.ej
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)
Ejemplo:
λ> putStrLn $ codeFormat "module X where x = 1 where { y 1 = 2; y _ = 2 }"
module X where
x = 1
where y 1 = 2
y _ = 2
Alternativamente, usted puede escribir una bonita impresora usted mismo (incluso en función de lo anterior si solo desea especializarse), y luego puede tener el estilo que desee. Reemplace prettyPrint
con el suyo. El AST es muy directo.
Luego puede conectarlo con Emacs para volver a formatear cada vez que presione guardar o algo así.
Solía escribir
data A = A {
a :: Double
}
deriving(Eq, Show)
pero ahora prefiero
data A = A {
a :: Double
} deriving(Eq, Show)
Creo que la respuesta será no, pero pregunto de todos modos: ¿hay un formateador de código para Haskell?
Hay un stylish-haskell que puede hacer exactamente lo que quieres.
He escrito un pequeño script para ese mismo propósito: https://github.com/djv/small/blob/master/tidy.hs Lo llamé desde vim para reformatear mi código.
Para imprimir un AST con comentarios, necesitaría ExactPrint
exactPrint :: ExactP ast => ast SrcSpanInfo -> [Comment] -> String
pero exactPrint
no imprimirá bastante sus fuentes.
He escrito una pequeña herramienta que puedes llamar con Vim como formateador externo.
prettyHS :: String -> String
prettyHS src
= case parseFileContentsWithComments defaultParseMode src of
ParseOk (ast, _) -> prettyPrint ast
_ -> src