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 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.