haskell code-formatting

¿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?




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