Comment on page

# Local Definitions

We already saw how we can use `where` to define local helper expressions, but there is also another way. The `let`-`in` construct also allows us to define local expressions with the syntax `let <declarations> in <expression>`:
sumSquares2 x y =
let
a = x ^ 2
b = y ^ 2
in
a + b
ghci> sumSquares2 2 5
29
We can also use `let` -`in` and `where` in combination – for example, let's write a function that checks whether the sum of the squares of two numbers is a multiple of five:
sumSquaresM5 x y =
let
sum = a + b
in
mod sum 5 == 0 -- (mod) is the modulo operator
where
a = x ^ 2
b = y ^ 2
We know a number is a multiple of five if the remainder of its division by five is zero. A thing to note is that there is a difference between `let`-`in` and `where`. What we define in `where` declarations is accessible to any code above it. However, the declarations from the `let` block are only accessible in the `in` block of the same `let-in` clause. For example, we could try to calculate the remainder from the division by five in the `where` clause using the `sum`from the `let` clause, but it will not work:
sumSquaresM5 x y =
let
sum = a + b
in
res == 0
where
a = x ^ 2
b = y ^ 2
res = mod sum 5 -- the "sum" expression from let-in is not accessible here
The compilation of the above would result in an error as `sum` is only accessible in the `in` clause of the code. This means that with `let`-`in` we can create super-localised expressions that aren't accessible anywhere outside the `in` code block.