O que é programação funcional?
⚡ Resumo Inteligente
A Programação Funcional é uma forma de construir software compondo funções puras, evitando estado compartilhado e dados mutáveis. Ela enfatiza expressões em vez de instruções, de modo que a saída de uma função depende apenas de suas entradas, o que torna os programas previsíveis e testáveis.

O que é programação funcional?
A programação funcional (também chamada de PF) é uma forma de pensar a construção de software através da criação de funções puras. Ela evita os conceitos de estado compartilhado e dados mutáveis observados na Programação Orientada a Objetos.
Linguagens funcionais enfatizam expressões e declarações em vez da execução de instruções. Portanto, diferentemente de outros procedimentos que dependem de um estado local ou global, o valor de saída em linguagens funcionais depende apenas dos argumentos passados para a função.
Características da Programação Funcional
- A metodologia de programação funcional foca nos resultados, não no processo.
- A ênfase está no que deve ser calculado.
- Os dados são imutáveis.
- A programação funcional decompõe o problema em funções.
- É baseado no conceito de funções matemáticas que utilizam expressões condicionais e recursão para realizar o cálculo.
- Não suporta iteração como instruções de laço e instruções condicionais como If-Else.
História da programação funcional
- A base da Programação Funcional é o Cálculo Lambda. Ele foi desenvolvido na década de 1930 para a aplicação, definição e recursão de funções.
- LISP foi a primeira linguagem de programação funcional. McCarthy a projetou em 1960.
- No final da década de 70, pesquisadores da Universidade de Edimburgo definiram a ML (Meta Linguagem).
- No início dos anos 80, a linguagem Hope adicionou tipos de dados algébricos para recursão e raciocínio equacional.
- Em 2004, foi criada a linguagem funcional 'Scala'.
Linguagens de Programação Funcional
O objetivo de qualquer linguagem de programação funcional é imitar funções matemáticas. No entanto, o processo básico de computação é diferente na programação funcional.
Aqui estão algumas das linguagens de programação funcional mais importantes:
- Haskell
- SML
- Clojure
- Scala
- Erlang
- peixe de água doce
- F#
- ML/OCaml Lisp / Esquema
- XSLT
- SQL
- Mathematica
Terminologia Básica de Programação Funcional e Concepts
Dados imutáveis
Dados imutáveis significam que você deve ser capaz de criar estruturas de dados facilmente, em vez de modificar as que já existem.
Transparência referencial
Programas funcionais devem executar operações como se fosse a primeira vez. Assim, você saberá o que pode ou não ter acontecido durante a execução do programa, bem como seus efeitos colaterais. Em termos de programação funcional, isso é chamado de transparência referencial.
Modularidade
O design modular aumenta a produtividade. Módulos pequenos podem ser codificados rapidamente e têm maior probabilidade de serem reutilizados, o que certamente leva a um desenvolvimento mais ágil de programas. Além disso, os módulos podem ser testados separadamente, o que ajuda a reduzir o tempo gasto em testes unitários e depuração.
Manutenção
Manutenibilidade é um termo simples que significa que a programação funcional é mais fácil de manter, pois você não precisa se preocupar em alterar acidentalmente nada fora da função especificada.
função de primeira classe
'Função de primeira classe' é uma definição atribuída a entidades de uma linguagem de programação que não possuem restrições de uso. Portanto, funções de primeira classe podem aparecer em qualquer lugar do programa.
Fechamento
Um closure é uma função interna que pode acessar variáveis da função pai, mesmo depois que a função pai já tiver sido executada.
Funções de ordem superior
As funções de ordem superior aceitam outras funções como argumentos ou as retornam como resultados.
Funções de ordem superior permitem aplicações parciais ou currying. Essa técnica aplica uma função aos seus argumentos um de cada vez, com cada aplicação retornando uma nova função que aceita o próximo argumento.
função pura
Uma 'função pura' é uma função cujas entradas são declaradas como entradas e nenhuma delas deve ser ocultada. As saídas também são declaradas como saídas.
Funções puras atuam sobre seus parâmetros. Não são eficientes se não retornarem nada. Além disso, oferecem a mesma saída para todos os parâmetros fornecidos.
Exemplo:
Function Pure(a,b) { return a+b; }
funções impuras
Funções impuras são exatamente o oposto de funções puras. Elas possuem entradas ou saídas ocultas, e é por isso que são chamadas de impuras. Funções impuras não podem ser usadas ou testadas isoladamente, pois possuem dependências.
Exemplo
int z; function notPure(){ z = z+10; }
Composição de Função
A composição de função é a combinação de 2 ou mais funções para criar uma nova.
Estados Compartilhados
O estado compartilhado é um conceito importante na programação orientada a objetos. Basicamente, trata-se de adicionar propriedades a objetos. Por exemplo, se um disco rígido é um objeto, a capacidade de armazenamento e o tamanho do disco podem ser adicionados como propriedades.
Side Effects
Efeitos colaterais são quaisquer alterações de estado que ocorrem fora de uma função chamada. O principal objetivo de qualquer linguagem de programação funcional é minimizar os efeitos colaterais, separando-os do restante do código do software. Em programação funcional, é vital isolar os efeitos colaterais da lógica de programação.
Os benefícios da programação funcional
- Permite evitar problemas e erros confusos no código.
- Mais fácil de testar e executar testes unitários e depurar FP Code.
- Processamento paralelo e concorrência.
- Implantação de código dinâmico e tolerância a falhas.
- Oferece melhor modularidade com código mais curto.
- Aumento da produtividade do desenvolvedor.
- Suporta funções aninhadas.
- Construções Funcionais como Lazy Map & Lists, etc.
- Permite o uso eficaz do Cálculo Lambda.
Limitações da Programação Funcional
- O paradigma da programação funcional não é fácil, sendo, portanto, difícil de entender para iniciantes.
- Difícil de manter, pois muitos objetos evoluem durante a codificação.
- Precisa de muita simulação e de uma configuração ambiental extensa.
- A reutilização é muito complicada e exige refatoração constante.
- Os objetos podem não representar o problema corretamente.
Programação Funcional vs. Programação Orientada a Objetos
| Programação Funcional | OOP |
|---|---|
| FP usa dados imutáveis. | OOP usa dados mutáveis. |
| Segue um modelo baseado em programação declarativa. | Segue um modelo de programação imperativa. |
| O foco principal é: "O que você está fazendo no programa." | O foco principal é: "Como você está fazendo sua programação." |
| Suporta programação paralela. | Sem suporte para programação paralela. |
| Suas funções não apresentam efeitos colaterais. | Um método pode produzir muitos efeitos colaterais. |
| O controle de fluxo é executado usando chamadas de função e chamadas de função com recursão. | O processo de controle de fluxo é conduzido usando loops e declarações condicionais. |
| A ordem de execução das instruções não é muito importante. | A ordem de execução das instruções é importante. |
| Apoia ambos os “Abstracção sobre dados” e “Abstracção sobre o comportamento.” | Suporta apenas “Abstracção sobre dados”. |

