Se descascarmos o açúcar sintático na frente e a geração de código na parte de trás e compararmos o que acontece entre a conversão de código fonte e código em execução para linguagens imperativas , como C ou Java, com linguagens funcionais como ML ou OCaml, geralmente encontraremos as seguintes diferenças em quê, por que e como.
Mutável vs. imutável
Com a programação funcional, tende-se a usar valores imutáveis, o que significa que não precisamos nos preocupar se um valor mudar por um meio externo à nossa função atual. Quando usado corretamente, remove todos os problemas relacionados aos efeitos colaterais .
Foco: Dados versus Função.
Quando se pensa em codificar como imperativo, primeiro se pensa em estruturas de dados e depois em quais métodos eles precisam. Ao trabalhar com programação funcional, primeiro se pensa em quais funções são necessárias e depois cria os tipos de dados necessários. A maioria dos tipos de dados é de lista lenta (think stream ou lista infinita) ou uniões discriminadas . Quando a união discriminada é recursiva, você cria instantaneamente uma árvore ou gráfico sem precisar escrever todo o código ambulante.
Genéricos / Polimorfismo paramétrico
Este é interessante e, se os meus fatos estiverem corretos, foi inventado com programação funcional e depois transplantado para programação imperativa. Então, se você gosta de genéricos, agradeça aos designers de linguagem funcional.
Transparência referencial / paralelização
Devido à transparência referencial, o código funcional pode ser transportado com mais facilidade para a computação paralela .
Função de ordem superior / composicionalidade
Como as funções podem criar novas funções e retornar funções, a criação de novas funções é baseada em outras funções e é tão fácil quanto criar novas expressões em vez de escrever novos métodos inteiros. Isso leva a morfismos que são muito úteis se o problema que você está resolvendo pode ser superado com a matemática. Fazer transformações de conjunto, como SQL e atualizações, é muito mais fácil com a programação funcional. Como observou a Wandering Logic , é aqui que as linguagens de programação funcional se destacam.
Digitação: Estática versus inferência .
Como os tipos são inferidos em vez de serem definidos pelo programador durante a gravação, mais verificações podem ser feitas para garantir a correção do código e, muitas vezes, as funções serão tornadas genéricas em vez de serem de um tipo definido.
Correspondência de padrão vs instrução switch
Ao combinar correspondência com uniões discriminadas, sua correspondência é verificada para garantir que você tenha coberto todos os resultados. Quantas vezes você teve um erro em tempo de execução porque perdeu um caso com uma instrução switch.