A Haskell program consists, basically, of a set of function definitions. Functions are
bound to names in a manner that looks very similar to variable assignment in other
languages. However, it really is not the same thing; a Haskell bound name is much more
similar to a binding in a mathematical proof, where we might say "Let tau refer to the
similar to a binding in a mathematical proof, where we might say "Let tau refer to the
equation . . ." A name binding just provides a shorthand for later use of an equation, but
the name can only be bound a single time within a program--trying to change it
generates a program error.