We have seen that functions are, in effect, abstractions that describe compound operations on numbers independent of the particular numbers. For example, when we declare

function cube(x) { return x * x * x; }

3 * 3 * 3; x * x * x; y * y * y;

Yet even in numerical processing we will be severely limited in our
ability to create abstractions if we are restricted to
functions
whose parameters must be numbers. Often the same programming pattern
will be used with a number of different
functions.
To express such patterns as concepts, we will need to construct
functions
that can accept
functions
as arguments or return
functions
as values.
Functions
that manipulate
functions
are called
*
higher-order
functions.
*
This section shows how higher-order
functions
can serve as powerful abstraction mechanisms, vastly increasing the
expressive power of our language.

1.3 Formulating Abstractions with Higher-Order Functions