Indent

From HaskellWiki

Indenting Haskell Mechanically[edit]

indent(1) is a tool to format C program source. At the time of writing we have no such tool for Haskell in common use -- although this would be fairly easy to write, given the existing parsing and pretty printing libraries.

Here are some other solutions

Emacs[edit]

Emacs has an indent mode. Though it is often considered poor at laying out Haskell code.

Use GHC[edit]

GHC provides a --ddump-parsed flag. It can be used as follows. Note that it will strip comments -- so take care! It will also normalise values -- so 0xdeadbeef becomes a large decimal.

    main = do  {
        ;print (f 10)
                ;      print (f 20)
       ;print (f 0xdeadbeef)       
    }                                                                                                 
    f x = sqrt  ( fromIntegral 
            (x * 10133123 `mod` 
                        1231111121 :: Int ))

Running it through:

$ ghc -fno-code -ddump-parsed B.hs
                                     
==================== Parser ====================
 main = do                                       
          print (f 10)
          print (f 20)
          print (f 3735928559)
 f x = sqrt (fromIntegral ((x * 10133123) `mod` 1231111121 :: Int))


Postprocess:

$ ghc -fno-code -ddump-parsed B.hs | sed '/^===/d'
 main = do
          print (f 10)
          print (f 20)
          print (f 3735928559)
 f x = sqrt (fromIntegral ((x * 10133123) `mod` 1231111121 :: Int))

Which is a reasonable result.

Use ghc-api[edit]

It may be possible to use ghc-api.

Use Language.Haskell[edit]

For Haskell98, this program should do the trick:

import Language.Haskell.Parser
import Language.Haskell.Pretty

main = interact $ \s ->
    case parseModule s of
        ParseFailed loc str -> (show loc)      ++ "\n"
        ParseOk m           -> (prettyPrint m) ++ "\n"

For example:

$ ghc -O Ppr.hs -package haskell-src
$ ./a.out < Ppr.hs
module Main (main) where
import Language.Haskell.Parser
import Language.Haskell.Pretty
main
   = interact $
       \ s ->
         case parseModule s of
             ParseFailed loc str -> (show loc) ++ "\n"
             ParseOk m -> (prettyPrint m) ++ "\n"

Or:

 main =  
   let {
       x = 7;
          } in 

              return (
                x + x
                        )

Becomes:

 module Main (main) where
 main = let x = 7 in return (x + x)

Lambdabot[edit]

Lambdabot has a pretty printing plugin that can be used for similar purposes. It only takes a single line of input though.

lambdabot> pretty main=let{x=7;y=3;z=4}in case x+y of { _|z<2 -> 1}

 main = let x = 7
            y = 3
            z = 4
        in case x + y of
            _ | z < 2 -> 1