Good layout style?

Wolfgang Jeltsch wolfgang@jeltsch.net
18 Sep 2002 21:22:58 +0200


On Wednesday, 2002-09-18, 07:22, CEST, Hal Daume III wrote:
> I think this is purely a personal taste kind of thing.  First off, though,
> only 'where', 'let', 'of' and 'do' induce layout.  I've seen many layout
> styles; the most common seem to be:
> 
>   let x = ...
>       y = ...
>       z = ...
>   in  e
> 
> which is probably a carryover from ML like languages where you might have
> to say
> 
>   let x = ...
>   let y = ...
>   let z = ...
>   in  e
> 
> sometimes "e" doesn't have two spaces before it and sometimes the "in" is
> indented an extra space.
> 
> it also seems to be fairly common to put the "in" on the end of the last
> line in the local definitions.
> 
> 'where' seems to be less variable.  by far the most common of what i've
> seen in:
> 
>   where x = ...
>         y = ...
> 
> but i've also seen
> 
>   where
>     x = ...
>     y = ...
> 
> the advantage here is that its very easy to remove the 'x' definition
> without having to reorder other things.
> 
> there seem to be two things people do with 'do'.  the first is obvious:
> 
>   do x ...
>      y ...
>      z ...
> 
> but another common one (esp in the ghc code) is:
> 
> myfunction = do
>   x ...
>   y ...
>   z ...
> 
> which i've recently become fond of.
> 
> with case/of, the most common seems to be:
> 
>   case x of
>     y   -> ...
>     abc -> ...
> 
> but the indentations vary by user.
> 
> if/then/else seems to be highly variable.  i personally like
> 
>   if foo
>     then bar
>     else baz
> 
> but opinions are likely to vary widely.
> 
> likely, |{different offered layout options}| >= |{people who respond to
> this email}|, though, so take anything with a grain of sand.
> 
>  - hal
> 
> --
> Hal Daume III
> 
>  "Computer science is no more about computers    | hdaume@isi.edu
>   than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume
> 
> On 18 Sep 2002, Dr Mark H Phillips wrote:
> 
> > On Wed, 2002-09-18 at 01:26, Hamilton Richards wrote:
> > > You can get the effect you're after by using let-expressions:
> > > 
> > > >  functn :: Int -> Int
> > > >  functn i
> > > >      | i>5       = let t = functn (i-2) in t * i
> > > >      | i>0       = let t = functn (i-1) in t * i
> > > >      | otherwise = 1
> > > 
> > > 'where' is part of the syntax of definitions, not expressions. This 
> > > enables a name defined in a where-clause to be used in more than one 
> > > guarded expression.
> > 
> > Thanks for this!  It would seem "let ... in ..." is what I want.
> > 
> > But I'm a bit confused about how to use the off-side rule in
> > conjunction with let.  Do I do:
> > 
> >     let a=1
> >         b=2
> >         c=3
> >     in a*b*c
> > 
> > or do I do:
> > 
> >     let
> >     a=1
> >     b=2
> >     c=3
> >     in
> >     a*b*c
> > 
> > or, in the context of a guard, do I do:
> > 
> >     | i>5      = let a=1; b=2; c=3
> >       in a*b*c
> > 
> > Basically I'm a bit confused about how the offside rule
> > works in various situations.
> > 
> > With "if ... then ... else ..." I don't know whether I should be doing
> > 
> >   f x = if x>5 
> >     then x*x 
> >     else 2*x
> > 
> > or
> > 
> >   f x = if x>5
> >         then x*x
> >         else 2*x
> > 
> > or
> > 
> >   f x = if x>5
> >           then x*x
> >             else 2*x
> > 
> > or what!
> > 
> > Hugs seems to think they are all legal.  Is there any rational as to
> > how to do layout?  Any tips would be greatly appreciated!
> > 
> > Thanks,
> > 
> > Mark.


Hi,

I prefer the following styles:

    for let statements:
        let
            variable1 :: type1
            variable1 = expression1

            variable2 :: type2
            variable2 = expression2
        in
        expression

    for where clauses:
        where
            variable1 :: type1
            variable1 = expression1

            variable2 :: type2
            variable1 = expression2

    for do statements:
        do
            variable1 <- expression1
            variable2 <- expression2
            expression

    for case statements:
        case expression of
            pattern1 -> expression1
            pattern2 -> expression2

        or, if lines would get too long,

        case expression of
            pattern1
                -> expression1
            pattern2
                -> expression2

    for if statements:
        if expression
            then texpression
            else eexpression

Wolfgang