Good layout style? (was: Re: "where" block local to a guard?)
Dr Mark H Phillips
mark@austrics.com.au
18 Sep 2002 12:05:00 +0930
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.