1.3 Formulação de abstrações com funções de ordem superior
Vimos que as funções são, na verdade, abstrações que descrevem operações compostas em números independentes dos números particulares. Por exemplo, quando declaramos
não estamos falando sobre o cubo de um determinado número, mas sim sobre um método para obter o cubo de qualquer número. Claro que poder íamos continuar sem nunca declarar esta função, sempre escrevendo expressões como
3 * 3 * 3
x * x * x
y * y * y
e nunca mencionando cube explicitamente. Isso nos colocaria em séria desvantagem, obrigando-nos a trabalhar sempre no nível das operações particulares que por acaso são primitivas na linguagem (multiplicação, neste caso), e não em termos de operações de nível superior. Nossos programas seriam capazes de computar cubos, mas nossa linguagem não teria a habilidade de expressar o conceito de cubos. Uma das coisas que devemos exigir de uma linguagem de programação poderosa é a capacidade de construir abstrações atribuindo nomes a padrões comuns e, em seguida, trabalhar em termos de abstrações diretamente. As funções fornecem essa capacidade. É por isso que todas as linguagens de programação, exceto as mais primitivas, incluem mecanismos para declarar funções.
No entanto, mesmo no processamento numérico, seremos severamente limitados em nossa capacidade de criar abstrações se ficarmos restritos a funções cujos parâmetros devem ser números. Frequentemente, o mesmo padrão de programação será usado com várias funções diferentes. Para expressar esses padrões como conceitos, precisaremos construir funções que podem aceitar funções como argumentos ou funções de retorno como valores. As funções que manipulam funções são chamadas de funções de ordem superior. Esta seção mostra como as funções de ordem superior podem servir como poderosos mecanismos de abstração, aumentando enormemente o poder expressivo de nossa linguagem