O programação funcional corresponde ao padrão de programação que se baseia no conceito de declarar o procedimento de um programa como um modelo funcional matemático ao invés de sequências explícitas de instruções para um processador, que é o conceito principal na programação imperativa.
A linguagem funcional enfatiza as declarações e termos, em vez da execução de declarações. Nesta programação, o resultado dependerá apenas dos parâmetros que são passados para uma função, ao contrário de outros tipos que obedecem a um estado local ou global.
Seu nome vem das funções matemáticas, que são a atribuição de um conjunto de entradas a um conjunto de saídas. Uma função matemática realmente não faz nenhum trabalho, mas descreve o modelo de um processo, explicando por meio de uma fórmula o que um conjunto de entradas produz em uma função.
Índice do artigo
A base sobre a qual a programação funcional foi baseada foi o cálculo lambda, que foi desenvolvido durante a terceira década do século 20 para definir e aplicar funções. LISP foi a primeira linguagem de programação desse tipo, projetada em 1960.
Embora a maioria das linguagens de programação consistam em entradas, saídas e variáveis externas que podem ser definidas ou usadas a partir de funções, a programação funcional evita isso. A ideia é que toda vez que uma função for chamada com os mesmos parâmetros, ela deverá retornar o mesmo valor.
As linguagens de programação funcional são chamadas de aplicativos, porque as funções são aplicadas aos seus parâmetros, assim como declarativas e não procedimentais, já que as definições especificam o que deve ser calculado e não como é calculado.
Uma função é pura quando não tem efeitos colaterais observáveis, como alteração de variáveis externas, mudanças no sistema de arquivos, etc..
Essas funções são consideradas convincentes, pois não alterarão expressamente nenhuma variável das quais outras partes do código possam depender em algum ponto. Pareceria estranho codificar com essas restrições, mas essas funções devem ser consideradas determinísticas, previsíveis e combináveis..
As funções são consideradas como valores que podem ser atribuídos a variáveis, portanto, podem ser passados e retornados de outras funções. Ou seja, uma função pode ser usada como se fosse um parâmetro ou como um valor que está sendo retornado.
Isso implica que a função pode ser passada como tal, em vez de apenas o resultado da função. Por exemplo, considere a função double (x), que retorna duas vezes o valor de seu parâmetro de entrada. Assim, duplo (2) retornaria 4.
Por ser uma função de primeira classe, o código (double (double (2)) seria igual ao código double (4). Isso permite aninhar uma função como parâmetro de outra e assim por diante.
Refere-se ao fato de que neste padrão de programação não há instruções de atribuição. Ou seja, novas variáveis devem ser definidas se você deseja armazenar valores adicionais. Portanto, o estado de uma variável é constante em todos os momentos.
Isso elimina a menor possibilidade de efeitos indesejados, pois qualquer variável pode ser substituída por seu valor real durante qualquer ponto de execução do programa..
Na programação funcional, não há loops "for" e "while". Em vez disso, a iteração depende da recursão. A recursão é implementada usando funções recursivas, que chamam a si mesmas repetidamente até que o caso base seja alcançado.
As variáveis são imutáveis, ou seja, não é possível modificar uma variável depois de inicializada. Embora uma nova variável possa ser criada, modificar variáveis existentes não é permitido.
Com um exemplo, você pode analisar a diferença entre essas abordagens, realizando a mesma operação em ambos os arranjos, que é filtrar os números ímpares de uma lista enquanto substitui 5 por números pares menores que 5.
É o mesmo cálculo, com o mesmo resultado. No entanto, como você pode ver, o código imperativo é prolixo e não é claro de imediato. Por outro lado, a abordagem declarativa é legível e explícita, porque se concentra no que você deseja obter.
O que é definido como funções puras e impuras pode ser esclarecido com alguns exemplos básicos:
Significa usar funções da mesma maneira que os dados são usados. Portanto, eles podem ser passados como parâmetros para outra função. No exemplo a seguir, a função int pode ser passada como um parâmetro para a função de mapa:
>>> lista (mapa (int, ["1", "2", "3"]))
[1, 2, 3]
Eles podem ser atribuídos a variáveis e retornados. Por exemplo, no código a seguir, você pode atribuir a função hello_world e, em seguida, executar a variável como uma função.
- Concentre-se no que você deseja alcançar (declarativo) e não em como alcançá-lo (imperativo).
- Eles não contêm instruções de atribuição, portanto, após as variáveis receberem um valor, elas não serão mais alteradas. Portanto, os programas funcionais não contêm efeitos colaterais.
- O fluxo lógico é claro, uma vez que o estado é menos disperso e não é modificado implicitamente.
- Suporta o conceito de avaliação preguiçosa, o que significa que o valor só é avaliado e armazenado quando necessário.
- Como as funções puras não mudam nenhum estado e são totalmente dependentes da entrada, elas são fáceis de entender. O valor de retorno dado por tais funções é o mesmo que o resultado produzido por elas.
- Devido à natureza das funções puras para evitar que as variáveis ou quaisquer dados externos mudem, a implementação da simultaneidade é eficaz.
- As funções são tratadas como valores, passados para outras funções como parâmetros. Isso melhora a compreensão e a legibilidade do código..
- As funções puras recebem os parâmetros uma vez, produzindo uma saída imutável. Usar valores inalteráveis torna a depuração e o teste mais fáceis.
Eles são mais curtos e fáceis de entender do que os imperativos. Estudos têm mostrado que a produtividade média do programador em termos de linhas de código é mais ou menos a mesma para qualquer linguagem de programação, traduzindo-se em maior produtividade.
Chamar uma função não pode ter um efeito diferente do que calcular seu resultado. Isso elimina uma importante fonte de erros, tornando também irrelevante a ordem de execução, uma vez que nenhum efeito secundário poderá alterar o valor de uma expressão, podendo ser avaliada a qualquer momento..
O programador é aliviado do fardo de estabelecer um fluxo de controle. Uma vez que as expressões podem ser avaliadas a qualquer momento, as variáveis podem ser substituídas por seus valores.
Essa autonomia favorece que os programas funcionais sejam mais matematicamente gerenciáveis do que os programas convencionais..
- O paradigma de programação funcional não é simples, tornando difícil para um iniciante entender.
- É difícil de manter, pois muitos objetos evoluem durante a codificação.
- Em alguns casos, escrever funções puras causa uma redução na legibilidade do código.
- Valores imutáveis em combinação com recursão podem levar a uma redução drástica no desempenho do sistema.
- Reutilizar é muito complicado e precisa de refatoração constante.
- Escrever programas em um estilo recursivo em vez de usar loops ou loops pode ser uma tarefa muito difícil..
- Objetos podem não representar o problema corretamente.
- Embora escrever funções puras acabe sendo fácil, combiná-las com o resto do aplicativo e com as operações de entrada / saída é bastante difícil
A programação de inteligência artificial é feita em linguagens de programação funcionais e as técnicas de inteligência artificial migram para aplicativos do mundo real.
Também se destaca na implementação de modelos matemáticos complexos. Por esse motivo, um dos principais usos das linguagens funcionais tem sido tradicionalmente acadêmico. É útil para desenvolver especificações executáveis e implementações de protótipos.
Muitas linguagens funcionais também se destacam na implementação de processamento paralelo. Isso se deve a sua capacidade de tirar proveito de funções puras, que sempre retornam o mesmo valor, independentemente da ordem em que são executadas..
O WhatsApp utiliza a linguagem de programação Erlang, que segue o modelo de programação funcional, permitindo assim que mais de uma centena de seus funcionários manuseiem os dados pertencentes a cerca de 1,6 bilhão de pessoas.
Outro portador importante do estilo de programação funcional é Haskell. É usado pelo Facebook em seu sistema antispam. Até o JavaScript, uma das linguagens de programação mais utilizadas, exibe as propriedades de uma linguagem funcional de tipo dinâmico.
Ele foi projetado após C ++, obtendo todos os seus benefícios enquanto elimina suas fraquezas observadas de ter que ser compatível com C.
É altamente escalável e simultâneo, tornando-o ideal para telecomunicações e outros aplicativos que recebem grandes quantidades de dados em uma ordem imprevisível..
Esta é uma linguagem de programação funcional pura, que usa cálculo Lambda.
É usado em aplicações matemáticas, científicas, financeiras, analíticas e outras. Um de seus pontos fortes é fazer software para lidar com outros programas.
É uma linguagem de código aberto baseada em Caml. Ele tende a criar programas muito leves, ajudando-os a carregar e rodar mais rápido do que aqueles criados por outras linguagens.
É baseado na sintaxe LISP e na estrutura ALGOL. Devido à sua simplicidade, é usado em muitos cursos de ciência da computação como uma introdução ao design de programas para mostrar alguns dos fundamentos da programação de computadores.
Ainda sem comentários