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