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
.
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.
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
]
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
]
Listado abaixo algumas das principais linguagens de programacao funcional:
- Prolog;
- Lisp;
- Scheme (Simplificacao do Lisp);
- ML (Criacao Universitaria);
- Miranda (Criacao Universitaria);
- Haskell;
- Elixir.
((
lambda
(
x
)
(
+
x
x
))
(
*
3
4
))
Neste caso, isso e o que aconteceria:
3*4 = 12;
x = 12;
x + x = 12 + 12 = 24;.
dobrarLista
lst
=
map
(
\
x
->
2
*
x
)
lst
Neste caso em Haskell, ele mapeia uma lista chamada
lst
dobrando seus valores.
[
9
]
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).
- 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