# Haskell Language Syntax in Functions Using where and guards

## Example

Given this function:

``````annualSalaryCalc :: (RealFloat a) => a -> a -> String
annualSalaryCalc hourlyRate weekHoursOfWork
| hourlyRate * (weekHoursOfWork * 52) <= 40000  = "Poor child, try to get another job"
| hourlyRate * (weekHoursOfWork * 52) <= 120000 = "Money, Money, Money!"
| hourlyRate * (weekHoursOfWork * 52) <= 200000 = "Ri¢hie Ri¢h"
| otherwise = "Hello Elon Musk!"
``````

We can use `where` to avoid the repetition and make our code more readable. See the alternative function below, using `where`:

``````annualSalaryCalc' :: (RealFloat a) => a -> a -> String
annualSalaryCalc' hourlyRate weekHoursOfWork
| annualSalary <= smallSalary  = "Poor child, try to get another job"
| annualSalary <= mediumSalary = "Money, Money, Money!"
| annualSalary <= highSalary   = "Ri¢hie Ri¢h"
| otherwise = "Hello Elon Musk!"
where
annualSalary = hourlyRate * (weekHoursOfWork * 52)
(smallSalary, mediumSalary, highSalary)  = (40000, 120000, 200000)
``````

As observed, we used the `where` in the end of the function body eliminating the repetition of the calculation (`hourlyRate * (weekHoursOfWork * 52)`) and we also used `where` to organize the salary range.

The naming of common sub-expressions can also be achieved with `let` expressions, but only the `where` syntax makes it possible for guards to refer to those named sub-expressions. PDF - Download Haskell Language for free