Static typing provides a way to find errors in advance. Expressions that cannot be assigned a type
are considered erroneous, and are rejected by the compiler.
Haskell also allows the programmer to define new types.
While a program which passes type checks is more likely to be correct, it is not a guarantee of
logical correctness.