Programação Funcional - Introdução
Linguagens de programação funcional são especialmente projetadas para lidar com computação simbólica e aplicativos de processamento de lista. A programação funcional é baseada em funções matemáticas. Algumas das linguagens de programação funcional populares incluem: Lisp, Python, Erlang, Haskell, Clojure, etc.
Linguagens de programação funcional são categorizadas em dois grupos, ou seja -
- Pure Functional Languages- Esses tipos de linguagens funcionais suportam apenas os paradigmas funcionais. Por exemplo - Haskell. 
- Impure Functional Languages- Esses tipos de linguagens funcionais suportam os paradigmas funcionais e a programação de estilo imperativo. Por exemplo - LISP. 
Programação Funcional - Características
As características mais proeminentes da programação funcional são as seguintes -
- Linguagens de programação funcional são projetadas no conceito de funções matemáticas que usam expressões condicionais e recursão para realizar cálculos. 
- Suporta programação funcional higher-order functions e lazy evaluation características. 
- Linguagens de programação funcional não oferecem suporte a controles de fluxo como instruções de loop e instruções condicionais como If-Else e Switch Statements. Eles usam diretamente as funções e chamadas funcionais. 
- Como OOP, as linguagens de programação funcional oferecem suporte a conceitos populares, como Abstração, Encapsulamento, Herança e Polimorfismo. 
Programação Funcional - Vantagens
A programação funcional oferece as seguintes vantagens -
- Bugs-Free Code - A programação funcional não suporta state, então não há resultados de efeito colateral e podemos escrever códigos sem erros. 
- Efficient Parallel Programming- Linguagens de programação funcional NÃO têm estado mutável, portanto, não há problemas de mudança de estado. Pode-se programar "Funções" para funcionar paralelamente como "instruções". Esses códigos oferecem fácil reutilização e testabilidade. 
- Efficiency- Os programas funcionais consistem em unidades independentes que podem ser executadas simultaneamente. Como resultado, esses programas são mais eficientes. 
- Supports Nested Functions - A programação funcional oferece suporte a funções aninhadas. 
- Lazy Evaluation - A programação funcional oferece suporte a construções funcionais preguiçosas, como listas preguiçosas, mapas preguiçosos etc. 
Como desvantagem, a programação funcional requer um grande espaço de memória. Como não possui estado, é necessário criar novos objetos a cada vez para realizar ações.
A Programação Funcional é usada em situações em que temos que realizar muitas operações diferentes no mesmo conjunto de dados.
- Lisp é usado para aplicativos de inteligência artificial, como aprendizado de máquina, processamento de linguagem, modelagem de fala e visão, etc. 
- Os interpretadores Lisp incorporados adicionam programabilidade a alguns sistemas como o Emacs. 
Programação Funcional vs. Programação Orientada a Objetos
A tabela a seguir destaca as principais diferenças entre a programação funcional e a programação orientada a objetos -
| Programação Funcional | OOP | 
|---|---|
| Usa dados imutáveis. | Usa dados mutáveis. | 
| Segue o modelo de programação declarativo. | Segue o modelo de programação imperativa. | 
| O foco está em: “O que você está fazendo” | O foco está em "Como você está indo" | 
| Suporta Programação Paralela | Não é adequado para programação paralela | 
| Suas funções não têm efeitos colaterais | Seus métodos podem produzir efeitos colaterais graves. | 
| O controle de fluxo é feito usando chamadas de função e chamadas de função com recursão | O controle de fluxo é feito por meio de loops e instruções condicionais. | 
| Ele usa o conceito de "Recursão" para iterar os Dados de Coleta. | Ele usa o conceito de "Loop" para iterar os dados de coleta. Por exemplo: For-each loop in Java | 
| A ordem de execução das instruções não é tão importante. | A ordem de execução das instruções é muito importante. | 
| Suporta "Abstração sobre Dados" e "Abstração sobre Comportamento". | Suporta apenas "Abstração sobre Dados". | 
Eficiência de um Código de Programa
A eficiência de um código de programação é diretamente proporcional à eficiência do algoritmo e à velocidade de execução. Boa eficiência garante maior desempenho.
Os fatores que afetam a eficiência de um programa incluem:
- A velocidade da máquina
- Velocidade do compilador
- Sistema operacional
- Escolhendo a linguagem de programação certa
- A forma como os dados em um programa são organizados
- Algoritmo usado para resolver o problema
A eficiência de uma linguagem de programação pode ser melhorada executando as seguintes tarefas -
- Removendo o código desnecessário ou o código que vai para o processamento redundante. 
- Fazendo uso de memória ideal e armazenamento não volátil 
- Fazendo o uso de componentes reutilizáveis sempre que aplicável. 
- Fazendo o uso do tratamento de erros e exceções em todas as camadas do programa. 
- Criando código de programação que garante a integridade e consistência dos dados. 
- Desenvolvendo o código do programa compatível com a lógica e o fluxo do design. 
Um código de programação eficiente pode reduzir o consumo de recursos e o tempo de conclusão tanto quanto possível, com risco mínimo para o ambiente operacional.