한국   대만   중국   일본 
Programacao funcional ? Wikipedia, a enciclopedia livre Saltar para o conteudo

Programacao funcional

Origem: Wikipedia, a enciclopedia livre.
Lambda, simbolo comumente usado para denotar abstracoes no calculo lambda.

Em ciencia da computacao , programacao funcional e um paradigma de programacao que trata a computacao como uma avaliacao de funcoes matematicas e que evita estados ou dados mutaveis. Ela enfatiza a aplicacao de funcoes , em contraste da programacao imperativa , que enfatiza mudancas no estado do programa. [ 1 ] Enfatizando as expressoes ao inves de comandos, as expressoes sao utilizados para calculo de valores com wikidados imutaveis. [ 2 ]

Uma funcao, neste sentido, pode ter ou nao ter parametros e um simples valor de retorno. Os parametros sao os valores de entrada da funcao, e o valor de retorno e o resultado da funcao. A definicao de uma funcao descreve como a funcao sera avaliada em termos de outras funcoes. Por exemplo, a funcao e definida em termos de funcoes de exponenciacao e adicao . Do mesmo modo, a linguagem deve oferecer funcoes basicas que nao requerem definicoes adicionais.

A programacao funcional trata as funcoes de forma em que estas possam ser passadas como parametro e valores para outras e funcoes e podendo ter o resultado armazenado em uma constante. [ 3 ]

Linguagens de programacao funcionais, especialmente as puramente funcionais, tem sido mais usadas academicamente que no desenvolvimento comercial de software . Entretanto, algumas linguagens notaveis usadas na industria e no comercio incluem Erlang (aplicacoes concorrentes), [ 4 ] R (estatistica), OCaml (quantitative trading) [ 5 ] , Mathematica (matematica simbolica) [ 6 ] J , K (analise financeira) e XSLT . [ 7 ] [ 8 ] Importantes influencias na programacao funcional foram o calculo lambda , as linguagens de programacao APL e Lisp , e mais recentemente ML , Haskell , OCaml , F# e Elixir .

Desenvolvimento [ editar | editar codigo-fonte ]

As funcoes podem ser manipuladas numa grande variedade de formas numa linguagem de programacao funcional. As funcoes sao tratadas como valores de primeira importancia, o que e o mesmo que dizer que funcoes podem ser parametros ou valores de entrada para outras funcoes e podem ser os valores de retorno ou saida de uma funcao. Entao podemos entender paradigma funcional como um mapeamento dos valores de entrada nos valores de retorno, atraves de funcoes. Isso permite que funcoes como mapcar em LISP e map em Haskell que tomam ambos uma funcao e uma lista como entrada e aplicam a funcao de entrada a cada elemento da lista. Funcoes podem ser nomeadas, como em outras linguagens, ou definidas anonimamente (algumas vezes durante a execucao do programa) usando uma abstracao lambda e usadas como valores em outras funcoes. Linguagens funcionais tambem permitem que funcoes sejam do tipo curry . Currying e uma tecnica para reescrita de funcoes com multiplos parametros como a composicao de funcoes de um parametro. A funcao do tipo curry pode ser aplicada apenas a um subconjunto de seus parametros. O resultado e uma funcao onde os parametros neste subconjunto sao agora fixados como constantes, e os valores do resto dos parametros ainda nao sao especificados. Esta nova funcao pode ser aplicada aos parametros restantes para obter o valor da funcao final. Por exemplo, uma funcao adiciona(x,y) = x + y pode ser do tipo curry de forma que o valor de retorno adiciona(2) ? note que nao ha um parametro y ? sera uma funcao anonima, o que e equivalente a funcao adiciona2(y) = 2 + y . Esta nova funcao tem apenas um parametro e corresponde a adicionar 2 a um numero. Novamente, isso e apenas possivel porque as funcoes sao tratadas como valores de primeira importancia.

O calculo lambda pode ser considerado a primeira linguagem de programacao funcional, embora nunca tenha sido projetada para ser realmente executada em um computador. E um modelo de computacao projetado por Alonzo Church nos anos 1930 que oferece um modo muito formal de descrever um calculo de uma funcao. A primeira linguagem de programacao funcional criada para computadores foi LISP , desenvolvida por John McCarthy no Instituto de Tecnologia de Massachusetts (MIT) no fim dos anos 1950 . Mesmo nao sendo uma linguagem de programacao puramente funcional, LISP introduziu a maioria das caracteristicas hoje encontradas nas modernas linguagens de programacao funcional. Scheme foi uma tentativa posterior de simplificar e melhorar LISP. Nos anos 1970 a linguagem ML foi criada pela Universidade de Edimburgo , e David Turner desenvolveu a linguagem Miranda na Universidade de Kent. A linguagem Haskell foi lancada no fim dos anos 1980 numa tentativa de juntar muitas ideias na pesquisa de programacao funcional.

Vantagens [ editar | editar codigo-fonte ]

O processo de alocacao de memoria e automatico nao sendo declarado pelo usuario, eliminando os erros de alocacao na funcao, desta maneira garantindo que a saida da funcao sera sempre o mesmo se dado um mesmo conjunto de dados. [ 3 ]

Desvantagens [ editar | editar codigo-fonte ]

Na programacao funcional alguns construtos basicos sobre programacao, como alocamento explicito de memoria ou de variaveis, sao dados como inexistentes, entretanto estes construtos ainda funcionam, porem de forma menos explicita. [ 3 ]

Linguagens de programacao [ editar | editar codigo-fonte ]

Listado abaixo algumas das principais linguagens de programacao funcional:

  • Prolog;
  • Lisp;
  • Scheme (Simplificacao do Lisp);
  • ML (Criacao Universitaria);
  • Miranda (Criacao Universitaria);
  • Haskell;
  • Elixir.

Exemplos [ editar | editar codigo-fonte ]

Scheme [ editar | editar codigo-fonte ]

((
lambda
 (
x
)
 (
+
 x
 x
))
 (
*
 3
 4
))

Neste caso, isso e o que aconteceria:

3*4 = 12;

x = 12;

x + x = 12 + 12 = 24;.

Haskell [ editar | editar codigo-fonte ]

dobrarLista
 lst
 =
 map
 (
\
x
 ->
 2
 *
 x
)
 lst

Neste caso em Haskell, ele mapeia uma lista chamada lst dobrando seus valores. [ 9 ]

Contraste com a programacao imperativa [ editar | editar codigo-fonte ]

A programacao funcional pode ser contrastada com a programacao imperativa . Na programacao funcional parecem faltar diversas construcoes frequentemente (embora incorretamente) consideradas essenciais em linguagens imperativas, como C ou Pascal . Por exemplo, numa programacao estritamente funcional, nao ha alocacao explicita de memoria , nem declaracao explicita de variaveis . No entanto, essas operacoes podem ocorrer automaticamente quando a funcao e invocada; a alocacao de memoria ocorre para criar espaco para os parametros e para o valor de retorno, e a declaracao ocorre para copiar os parametros dentro deste espaco recem-alocado e para copiar o valor de retorno de volta para dentro da funcao que a chama. Ambas as operacoes podem ocorrer nos pontos de entrada e na saida da funcao, entao efeitos colaterais no calculo da funcao sao eliminados. Ao nao permitir efeitos colaterais em funcoes, a linguagem oferece transparencia referencial. Isso assegura que o resultado da funcao sera o mesmo para um dado conjunto de parametros nao importando onde, ou quando, seja avaliada. Transparencia referencial facilita muito ambas as tarefas de comprovar a correcao do programa e automaticamente identificar computacoes independentes para execucao paralela.

Lacos, outra construcao de programacao imperativa, estao presentes atraves da construcao funcional mais geral de recursividade . Funcoes recursivas invocam a si mesmas, permitindo que uma operacao seja realizada varias vezes. Recursividade em programacao funcional pode assumir varias formas e e em geral uma tecnica mais poderosa que o uso de lacos. Por essa razao, quase todas as linguagens imperativas tambem a suportam (sendo Fortran 77 e COBOL excecoes notaveis).

Ver tambem [ editar | editar codigo-fonte ]

Bibliografia [ editar | editar codigo-fonte ]

  • Cousineau, Guy and Michel Mauny. The Functional Approach to Programming . Cambridge, UK: Cambridge University Press, 1998.
  • Graham, Paul. ANSI Common LISP . Englewood Cliffs, New Jersey: Prentice Hall, 1996.
  • Pratt, Terrence, W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation . 3rd ed. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
  • Salus, Peter H. Functional and Logic Programming Languages. Vol. 4 of Handbook of Programming Languages . Indianapolis, Indiana: Macmillan Technical Publishing, 1998.
  • Thompson, Simon. Haskell: The Craft of Functional Programming . Harlow, England: Addison-Wesley Longman Limited, 1996.

Referencias

  1. Paul Hudak (setembro de 1989 ). " Conception, evolution, and application of functional programming languages " (pdf) . ACM Computing Surveys.
  2. R. Gudwin, Ricardo. ≪Linguagens de Programacao≫ (PDF) . Universidade Estadual de Campinas Faculdade de Engenharia Eletrica e de Computacao  
  3. a b c Jungthon, Machado Goulart, Gustavo, Cristian. ≪Paradigmas de Programacao≫ (PDF) . Faculdade de Informatica de Taquara (FIT)  
  4. ≪Who uses Erlang for product development?≫ (em ingles) . Consultado em 27 de junho de 2006  
  5. ≪Technology :: Jane Street≫ . www.janestreet.com (em ingles) . Consultado em 25 de setembro de 2023  
  6. Departamento de Matematica Aplicada, Universidade do Colorado. ≪Functional vs. Procedural Programming Language≫ (em ingles) . Consultado em 28 de agosto de 2006 . Arquivado do original em 13 de novembro de 2007  
  7. Dimitre Novatchev. ≪The Functional Programming Language XSLT - A proof through examples≫ (em ingles) . Consultado em 27 de maio de 2006  
  8. David Mertz. ≪XML Programming Paradigms (part four): Functional Programming approached to XML processing≫ (em ingles) . Consultado em 27 de maio de 2006  
  9. ≪Haskell/Lambdas e operadores - Wikilivros≫ . pt.wikibooks.org . Consultado em 9 de abril de 2019