Programação puramente funcional

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

Na ciência da computação , a programação puramente funcional geralmente designa um paradigma de programação — um estilo de construção da estrutura e dos elementos dos programas de computador — que trata toda a computação como a avaliação de funções matemáticas . A programação puramente funcional também pode ser definida pela proibição de mudanças de estado e dados mutáveis .

A programação puramente funcional consiste em garantir que as funções, dentro do paradigma funcional , dependam apenas de seus argumentos, independentemente de qualquer estado global ou local.

Diferença entre programação funcional pura e impura

A diferença exata entre programação funcional pura e impura é uma questão de controvérsia. [1]

Um programa é geralmente dito funcional quando usa alguns conceitos de programação funcional , como funções de primeira classe e funções de ordem superior . [2] No entanto, uma função de primeira classe não precisa ser puramente funcional, pois pode usar técnicas do paradigma imperativo , como arrays ou métodos de entrada/saída que não são programas puramente funcionais. De fato, as primeiras linguagens de programação citadas como funcionais, IPL e Lisp , [3] [4] eram ambas linguagens funcionais "impuras" pela definição atual.

Estruturas de dados puramente funcionais são persistentes . Persistência é necessária para programação funcional; sem ele, a mesma computação poderia retornar resultados diferentes. A programação funcional pode usar estruturas de dados não puramente funcionais persistentes , enquanto essas estruturas de dados não podem ser usadas em programas puramente funcionais.

Propriedades da programação puramente funcional

Avaliação estrita versus não estrita

Cada estratégia de avaliação que termina em um programa puramente funcional retorna o mesmo resultado. Em particular, ele garante que o programador não precise considerar em qual ordem os programas são avaliados, pois a avaliação ansiosa retornará o mesmo resultado que a avaliação preguiçosa . No entanto, ainda é possível que uma avaliação antecipada não termine enquanto a avaliação lenta do mesmo programa é interrompida. Uma vantagem disso é que a avaliação preguiçosa pode ser implementada com muito mais facilidade; como todas as expressões retornarão o mesmo resultado a qualquer momento (independentemente do estado do programa), sua avaliação pode ser atrasada o quanto for necessário.

Computação paralela

A programação puramente funcional simplifica a computação paralela [5] uma vez que duas partes puramente funcionais da avaliação nunca interagem.

Estruturas de dados

Estruturas de dados puramente funcionais são frequentemente representadas de uma maneira diferente de suas contrapartes imperativas . [6] Por exemplo, array com acesso e atualização em tempo constante é um componente básico da maioria das linguagens imperativas e muitas estruturas de dados imperativas, como tabela de hash e heap binário , são baseadas em arrays. Arrays podem ser substituídos por map ou random access list , que admite implementação puramente funcional, mas o tempo de acesso e atualização é logarítmico. Portanto, estruturas de dados puramente funcionais podem ser usadas em linguagens não funcionais, mas podem não ser a ferramenta mais eficiente disponível, especialmente se a persistência não for necessária.

Em geral, a conversão de um programa imperativo para um puramente funcional também requer a garantia de que as estruturas anteriormente mutáveis ​​agora sejam retornadas explicitamente das funções que as atualizam, uma estrutura de programa chamada estilo de passagem de loja .

Linguagem puramente funcional

Uma linguagem puramente funcional é uma linguagem que só admite programação puramente funcional. Programas puramente funcionais podem, entretanto, ser escritos em linguagens que não são puramente funcionais.

Referências

  1. ^ Sabry, Amr (janeiro de 1993). "O que é linguagem puramente funcional?". Jornal de Programação Funcional . 8 (1): 1–22. CiteSeerX  10.1.1.27.7800 . doi : 10.1017/S0956796897002943 .
  2. Atencio, Luis (18 de junho de 2016). Programação Funcional em Javascript . Manning Publicações. ISBN 978-1617292828.
  3. As memórias de Herbert A. Simon (1991), Models of My Life pp.189-190 ISBN 0-465-04640-1 afirma que ele, Al Newell e Cliff Shaw são "comumente considerados pais de [o ] inteligência artificial [campo]", para escrever Logic Theorist , um programa que prova teoremas do Principia Mathematica automaticamente. Para conseguir isso, eles tiveram que inventar uma linguagem e um paradigma que, visto retrospectivamente, incorpora a programação funcional. 
  4. ^ McCarthy, John (junho de 1978). "História do Lisp" . In ACM SIGPLAN History of Programming Languages ​​Conference : 217–223. doi : 10.1145/800025.808387 .
  5. Marlow, Simon (18 de junho de 2013). Programação Paralela e Concorrente em Haskell: Técnicas de Programação Multicore e Multithreaded . Mídia O'Reilly. ISBN 978-1449335946.
  6. Estruturas de dados puramente funcionais por Chris Okasaki , Cambridge University Press , 1998, ISBN 0-521-66350-4