Haskell indentation

John Meacham john@repetae.net
Tue, 26 Aug 2003 11:58:20 -0700


On Tue, Aug 26, 2003 at 02:00:32PM +0200, Per Larsson wrote:
> I have problems finding a pleasing indentation style for haskell code.
> Especially nested do-blocks have a tendency to run away to the right margin.
> When looking on source code from experienced haskell programmers, there 
> seems not to be any consensus at all, everyone uses their own convention 
> and in many cases one changes style in the same module.
> 
> Also, the automatic tools are problematic: the emacs mode I'm using
> bails out in certain contexts and there are few user customizations available. 
> The haskell-src module in the GHC library offers a parser
> and pretty-printer for haskell code with nice options for customizing
> the indentation, but it can't handle comments which is a problem if
> you want to use it as a basis for implementing a indentation tool.
> 
> Is there anyone who have given this some thought and have some
> suggestions for a consistent indentation style and/or desktop tools
> which I'm not aware of?

I highly recommend the always-enter model. which means when you are
using layout you always do a linebreak after any block forming construct
(do, let, while, ...) and indent one more softtab level than the
surrounding code. this has a number of advantages:
 * no need for special modes or editor support
 * indents are always an integral number of softtabs.
 * code doesn't run off the right side of the screen since your
   indentation level is relative to the start of the line, not the
   expression that started it.
 * cut-n-paste of code blocks is easier.

examples of what I mean can be seen here: http://repetae.net/john/computer/haskell/

I have known several people to get turned off of haskell when trying to
recreate the indent style usually found in publications by hand... 

        John 

-- 
---------------------------------------------------------------------------
John Meacham - California Institute of Technology, Alum. - john@foo.net
---------------------------------------------------------------------------