Contraste com a programação imperativa
A programação funcional pode ser contrastada com a
programação imperativa. Na programação funcional parecem faltar diversas construções freqüentemente (embora incorretamente) consideradas essenciais em linguagens imperativas, como
C ou
Pascal. Por exemplo, em uma programação estritamente funcional, não há alocação explícita de
memória, nem declaração explícita de
variáveis. No entanto, essas operações podem ocorrer automaticamente quando a função é invocada; a alocação de memória ocorre para criar espaço para os parâmetros e para o valor de retorno, e a declaração ocorre para copiar os parâmetros dentro deste espaço recém-alocado e para copiar o valor de retorno de volta para dentro da função que a chama. Ambas as operações podem ocorrer nos pontos de entrada e na saída da função, então efeitos colaterais no cálculo da função são eliminados. Ao não permitir efeitos colaterais em funções, a linguagem oferece transparência referencial. Isso assegura que o resultado da função será o mesmo para um dado conjunto de parâmetros não importando onde, ou quando, seja avaliada. Transparência referencial facilita muito ambas as tarefas de comprovar a correção do programa e automaticamente identificar computações independentes para execução paralela.
Laços, outra construção de programação imperativa, está presente através da construção funcional mais geral de
recursividade. Funções recursivas invocam-se a si mesmas, permitindo que uma operação seja realizada várias vezes. Na verdade, isso prova que laços são equivalentes a um tipo especial de recursividade chamada recursividade reversa. Recursividade em programação funcional pode assumir várias formas e é em geral uma técnica mais poderosa que o uso de laços. Por essa razão, quase todas as linguagens imperativas também a suportam (sendo
Fortran 77 e
COBOL exceções notáveis).