Programação funcional: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
LinharesXT (discussão | contribs)
m Correções ortográficas
m Ortografia: em uma->numa (com AVT)
Linha 34:
 
== Desenvolvimento ==
As funções podem ser manipuladas em umanuma grande variedade de formas em umanuma [[linguagem de programação]] funcional. As funções são tratadas como valores de primeira importância, o que é o mesmo que dizer que funções podem ser parâmetros ou valores de entrada para outras funções e podem ser os valores de retorno ou saída de uma função. Então podemos entender paradigma funcional como um mapeamento dos valores de entrada nos valores de retorno, através de funções. Isso permite que funções como <code>mapcar</code> em [[LISP]] e <code>map</code> em [[Haskell]] que tomam ambos uma função e uma [[lista encadeada|lista]] como entrada e aplicam a função de entrada a cada elemento da lista. Funções podem ser nomeadas, como em outras linguagens, ou definidas anonimamente (algumas vezes durante a execução do programa) usando uma abstração [[cálculo lambda|lambda]] e usadas como valores em outras funções. Linguagens funcionais também permitem que funções sejam do tipo ''curry''. ''[[Currying]]'' é uma técnica para reescrita de funções com múltiplos parâmetros como a composição de funções de um parâmetro. A função do tipo ''curry'' pode ser aplicada apenas a um subconjunto de seus parâmetros. O resultado é uma função onde os parâmetros neste subconjunto são agora fixados como constantes, e os valores do resto dos parâmetros ainda não são especificados. Esta nova função pode ser aplicada aos parâmetros restantes para obter o valor da função final. Por exemplo, uma função <code>adiciona(x,y) = x + y</code> pode ser do tipo ''curry'' de forma que o valor de retorno <code>adiciona(2)</code> — note que não há um parâmetro y — será uma função anônima, o que é equivalente à função <code>adiciona2(y) = 2 + y</code>. Esta nova função tem apenas um parâmetro e corresponde a adicionar 2 a um número. Novamente, isso é apenas possível porque as funções são tratadas como valores de primeira importância.
 
O cálculo lambda pode ser considerado a primeira linguagem de programação funcional, embora nunca tenha sido projetada para ser realmente executada em um computador. É um modelo de computação projetado por [[Alonzo Church]] nos [[década de 1930|anos 1930]] que oferece um modo muito formal de descrever um cálculo de uma função. A primeira linguagem de programação funcional criada para computadores foi [[LISP]], desenvolvida por [[John McCarthy]] no [[Instituto de Tecnologia de Massachusetts]] (MIT) no fim dos [[anos 1950]]. Mesmo não sendo uma linguagem de programação puramente funcional, LISP introduziu a maioria das características hoje encontradas nas modernas linguagens de programação funcional. [[Scheme]] foi uma tentativa posterior de simplificar e melhorar LISP. Nos [[anos 1970]] a linguagem [[ML (linguagem de programação)|ML]] foi criada pela [[Universidade de Edimburgo]], e [[David Turner]] desenvolveu a linguagem [[Miranda]] na Universidade de Kent. A linguagem [[Haskell (linguagem de programação)|Haskell]] foi lançada no fim dos [[anos 1980]] em umanuma tentativa de juntar muitas ideias na pesquisa de programação funcional.
 
== Contraste com a programação imperativa ==
A programação funcional pode ser contrastada com a [[programação imperativa]]. Na programação funcional parecem faltar diversas construções freqüentemente (embora incorretamente) consideradas essenciais em linguagens imperativas, como [[Linguagem de programação C|C]] ou [[Pascal (linguagem de programação)|Pascal]]. Por exemplo, em umanuma programação estritamente funcional, não há alocação explícita de [[memória de computador|memória]], nem declaração explícita de [[Variável (programação)|variáveis]]. No entanto, essas operações podem ocorrer automaticamente quando a função é invocada; a alocação de memória ocorre para criar espaço para os parâmetros e para o valor de retorno, e a declaração ocorre para copiar os parâmetros dentro deste espaço recém-alocado e para copiar o valor de retorno de volta para dentro da função que a chama. Ambas as operações podem ocorrer nos pontos de entrada e na saída da função, então efeitos colaterais no cálculo da função são eliminados. Ao não permitir efeitos colaterais em funções, a linguagem oferece transparência referencial. Isso assegura que o resultado da função será o mesmo para um dado conjunto de parâmetros não importando onde, ou quando, seja avaliada. Transparência referencial facilita muito ambas as tarefas de comprovar a correção do programa e automaticamente identificar computações independentes para execução paralela.
 
Laços, outra construção de programação imperativa, estão presentes através da construção funcional mais geral de [[Recursividade (ciência da computação)|recursividade]]. Funções recursivas invocam a si mesmas, permitindo que uma operação seja realizada várias vezes. Na verdade, isso prova que laços são equivalentes a um tipo especial de recursividade chamada recursividade reversa. Recursividade em programação funcional pode assumir várias formas e é em geral uma técnica mais poderosa que o uso de laços. Por essa razão, quase todas as linguagens imperativas também a suportam (sendo [[Fortran|Fortran 77]] e [[COBOL]] exceções notáveis).