Programacao Funcional

Você também pode gostar

Você está na página 1de 7

TRABALHO DE PROGRAMAO FUNCIONAL

LINGUAGEM DE PROGRAMAO I

Raimundo Alan F. Moreira, Antnio Victor C. Passos, Otavio R. Neto, Jos Almeida Jnior.

Bacharelado em Cincias da Computao


Centro de Cincias Exatas e Tecnologia (CCET)
Universidade Estadual Vale do Acara (UeVA), Brasil, 62040-370
Fone: (88) 3677-4271
alan_freire@msn.com, vpassos10@hotmail.com, otavio-rn@hotmail.com, jr.poranga@yahoo.com.br.

Resumo. Pretendemos neste artigo mostra como surgiu o estilo de programao funcional,
para que usada, o conceito desse modo de programao, os contrastes com a
programao imperativa, sua aplicao no desenvolvimento de softwares e as vantagens e
desvantagem de se trabalhar com o paradigma funcional.

Palavras-chave: Linguagem Funcional, Haskell, Scheme, paradigma funcional.

Abstract. We intend in this article shows how did the functional programming style, that is
used, the concept of this mode, the contrast with imperative programming, its application in
software development and the advantages and disadvantages of working with the functional
paradigm.

Keywords: Functional Language, Haskell, Scheme, functional paradigm.

1. Introduo

O clculo lambda um modelo de computao projetado por Alonzo Church nos anos
1930 que oferece um modo muito formal de descrever um clculo de uma funo, embora
no tenha sido criada para computador foi o alicerce para a programao funcional. A
primeira linguagem com esse paradigma foi LISP projetada pro Jhon MacCarthy no MIT no
fim dos anos 1950. A partir dai surgem outras LPs funcionais como ML, Miranda, Scheme,
Haskell, etc. Nas LPs estritamente funcionais no h alocao explicita de memria nem de
declarao de variveis, pois essa operao ocorre automaticamente quando a funo
invocada.
Nesse trabalho mostraremos os dados histricos, paradigma funcional, contraste com a
programao imperativa, universo de aplicao, uso prtico, trabalhando com a
programao funcional e sua aplicao prtica, vantagens e desvantagens de se trabalhar
com o paradigma funcional.

2. Dados histricos

Nos anos 40 os primeiros computadores foram construdos. Nesta poca devido aos altos
custos, era justificvel ter uma linguagem que trabalhasse o mais prximo possvel da
arquitetura do computador, ou seja, as primeiras linguagens de programao tinham como
abstrao o prprio hardware.
Como sabemos, um computador consiste de uma unidade de processamento e memria,
ento um programa era composto por instrues que modificavam a memria, executados
pela unidade de processamento. Linguagens como C e Pascal foram marcados por esse
estilo, chamado de programao imperativa, onde havia uma serie de atribuies executadas
seqencialmente.
No entanto antes de existirem computadores, as pessoas resolviam problemas de outras
formas. A principal delas, atravs da matemtica pura. Na matemtica, pelo menos nos
ltimos 400 anos, funes tem desempenhado um papel central. Funes representam a
conexo entre parmetros de entrada e o resultado de sada de um determinado processo.
Em uma funo determinstica o resultado depende apenas dos seus parmetros. Logo uma
funo uma excelente forma de se especificar uma computao. Esta a base do estilo de
programao funcional.
O clculo lambda pode ser considerado a primeira linguagem de programao funcional,
embora nunca tenha sido projetada para ser realmente executada em um computador. um
modelo de computao projetado por Alonzo Church nos anos 1930 que oferece um modo
muito formal de descrever um clculo de uma funo. A primeira linguagem de
programao funcional criada para computadores foi LISP, desenvolvida por Jhon
McCarthy no Instituto de Tecnologias de Massachusetts (MIT) no fim dos anos 1950.
Mesmo no sendo uma linguagem de programao puramente funcional, LISP introduziu a
maioria das caractersticas hoje encontradas nas modernas linguagens de programao
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 Tumer
desenvolveu a linguagem Miranda na Universidade de Kent. A linguagem Haskell foi
lanada no fim dos anos 1980 em uma tentativa de juntar muitas idias na pesquisa de
programao funcional.

3. Paradigma funcional

um paradigma de programao que trata a computao como uma avaliao de funes


matemticas e que evita estado ou dados mutveis. Ela enfatiza a aplicao de funes, em
contraste da programao imperativa, que enfatiza mudanas no estado do programa.
Uma funo, neste sentido, pode ter ou no ter parmetros e um simples valor de retorno.
Os parmetros so os valores de entrada da funo, e o valor de retorno o resultado da
funo. A definio de uma funo descreve como a funo ser avaliada em termos de
outras funes. Por exemplo, a funo f(x) = x2 + 2 definida em termos de funes de
exponenciao e adio. Do mesmo modo, a linguagem deve oferecer funes bsicas que
no requerem definies adicionais.
Linguagem funcional o conceito de funes de primeira classe. A idia que voc pode
passar funes como parmetros para outras funes e devolv-los como valores.
Programao funcional envolve escrever cdigo que no muda de estado. A principal razo
para isso assim que as sucessivas chamadas para uma funo ir produzir o mesmo
resultado. Voc pode escrever cdigo funcional em qualquer linguagem que suporte funes
de primeira classe, mas existem alguns idiomas, como Haskell, que no permitem a
alterao do estado.
Em uma funo determinstica o resultado depende apenas dos seus parmetros. Logo uma
funo uma excelente forma de se especificar uma computao. Esta a base do estilo de
programao funcional.
Linguagens funcionais operam apenas sobre funes, as quais recebem listas de valores e
retornam um valor. O objetivo da programao funcional definir uma funo que retorne
um valor como a resposta do problema. Um programa funcional uma chamada de funo
que normalmente chama outras funes para gerar um valor de retorno. As principais
operaes nesse tipo de programao so a composio de funes e a chamada recursiva
de funes.
Pode-se pensar na programao funcional como simplesmente avaliao expresses. O
programador define uma funo para resolver um problema, e passa esta para o computador
avaliar. Uma funo pode envolver vrias outras funes em sua definio. O computador
funciona ento como uma calculadora que avalia as expresses escritas pelo programador
atravs de simplificaes at chegar a uma forma normal.
A caracterstica que domina na programao funcional que o significado de uma
expresso seu valor, e o papel do computador simplesmente obt-lo. Outra caracterstica
que uma funo em uma linguagem funcional pode ser construda, manipulada e
resolvida, como qualquer outro tipo de expresso matemtica, usando leis algbricas.
Como a entidade principal da programao funcional a funo, pode-se definir listas de
funes, funes podem devolver como resultado outras funes e podem ser passadas
como argumento para funes.

4. Contraste com a programao imperativa

A programao funcional pode ser contrastada com a programao imperativa. Na


programao funcional parecem faltar diversas construes freqentemente (embora
incorretamente) consideradas essenciais em linguagens imperativas, como C ou Pascal. Por
exemplo, em uma programao estritamente funcional, no h alocao explcita de
memria, nem declarao explcita de variveis. No entanto, essas operaes podem ocorrer
automaticamente quando a funo invocada; a alocao de memria ocorre para criar
espao para os parmetros e para o valor de retorno, e a declarao ocorre para copiar os
parmetros dentro deste espao recm-alocado e para copiar o valor de retorno de volta para
dentro da funo que a chama. Ambas as operaes podem ocorrer nos pontos de entrada e
na sada da funo, ento efeitos colaterais no clculo da funo so eliminados. Ao no
permitir efeitos colaterais em funes, a linguagem oferece transparncia referencial. Isso
assegura que o resultado da funo ser o mesmo para um dado conjunto de parmetros no
importando onde, ou quando, seja avaliada. Transparncia referencial facilita muito ambas
as tarefas de comprovar a correo do programa e automaticamente identificar computaes
independentes para execuo paralela.
Laos, outra construo de programao imperativa, est presente atravs da construo
funcional mais geral de recursividade. Funes recursivas invocam-se a si mesmas,
permitindo que uma operao seja realizada vrias vezes. Na verdade, isso prova que laos
so equivalentes a um tipo especial de recursividade chamada recursividade reversa.
Recursividade em programao funcional pode assumir vrias formas e em geral uma
tcnica mais poderosa que o uso de laos. Por essa razo, quase todas as linguagens
imperativas tambm a suportam (sendo Fortran e COBOL excees notveis).

5. Universo de aplicao

Linguagens de programao funcionais, especialmente as puramente funcionais, tem sido


mais usadas academicamente como na rea de pesquisas acadmicas que no
desenvolvimento de software. Entretanto, algumas linguagens notveis usadas na indstria e
no comrcio incluem Erlang (aplicaes concorrentes)R (estatstica), Mathematica
(matemtica simblica) J e K(anlise financeira) e XSLT.

6. Usos prticos

Programas com milhares de linhas de cdigo:

Compiladores provadores de teoremas;


Sistemas web;
Servios de chat de grande escala;
Processamento de reclamaes sobre abusos na internet;
Simulao para a estimativa de riscos em operaes financeiras;
Programao de switches de redes na Ericsson;
Parte do servio de chat do Facebook;
Servio de filas de mensagens no twitter;
Ensino de programao em varias universidades;
Verificao de HW e Sw na Microsoft e na Intel;
Esto ganhando destaque na implementao de sistemas operacionais;

7. Trabalhando com a Programao Funcional

Para avaliar uma expresso em um ambiente funcional, deve-se pass-la para o


computador que ir reduzi-la a uma resposta.
Supondo que o smbolo (>) representa o prompt de um interpretador, tem-se:

> 29
29

O computador ento devolve o nmero 29, pois ele uma expresso em sua forma mais
simples, no podendo sofrer um processo de avaliao.
Uma expresso mais complexa seria:

>5 * 3
15

Aqui o computador simplifica a expresso realizando a multiplicao.


Outra caracterstica muito importante da programao funcional a construo de
definies. Uma lista de definies chama-se script. Exemplo de script:
square x = x * x
somaEmult x y = 3 * (x + y)

No script acima duas funes, square e somaEmult foram definidas. A funo square toma
um valor x e o multiplica por ele mesmo. A funo somaEmult devolve a soma de seus
argumentos multiplicada por 3. Nota-se que as funes foram definidas atravs de equaes
e que uma definio pode ser considerada como uma definio lgica de como a funo se
comporta. Em outras palavras, uma definio funcional pode ser vista como uma
especificao do problema.
Tendo criado scripts pode-se us-los em uma avaliao no computador.
Exemplos:

> square (2 + 3)
25
> somaEmult 1 2
9
> square (somaEmult 2 4)
324

O objetivo de uma definio ligar um nome a um valor. No script anterior, por exemplo,
o nome square associado a uma funo que eleva um valor ao quadrado.
8. Aplicao prtica.

Um algoritmo funcional tratado como um conjunto de funes matemticas. O que isso


quer dizer?
Para visualizar isso, vamos ao clssico exemplo do fatorial.
Matematicamente falando, n! (n fatorial) o produto de todos os nmeros menores ou
iguais a n. Ou seja, o produto entre todos os nmeros de 1 at n. Por exemplo: 5! = 1 * 2 * 3
*4*5

Observe que 0! = 1 j que o resultado de no se multiplicar nenhum nmero (identidade


multiplicativa) 1 (mais informaes em http://en.wikipedia.org/wiki/Empty_product).

Normalmente existem 2 formas de se fazer isso: recursiva e interativa:

Recursiva:

int fatorial(int n)
{
if(n <= 1)
return 1;
return n * fatorial(n - 1);
}

Interativa:

int fatorial(int n)
{
int r = 1;

while(n > 1)
r *= n--;
return r;
}

Isso em uma linguagem funcional (no caso, Haskell), ficaria como:

fatorial :: Int -> Int


fatorial 0 = 1
fatorial n = n * fatorial (n - 1)

Ou seja, literalmente o que diz a definio: o produto entre todos os nmeros de 1 at n.

Uma das principais vantagens disso a reduo da quantidade de cdigo. Considerando


que a declarao do tipo no necessariamente obrigatria (apesar de uma boa prtica) a
funo pode ser implementada em apenas uma ou duas linhas, respeitando os padres de
indentao e tudo mais.

Soma de 1 a 100 em C e em Haskell

Operao baseada em atribuio de variveis

int total = 0;
for (i = 1; i <= 100; i++)
total = total + 1;

A mesma varivel(total) muda de valor 100 vezes durante a operao (efeito colateral)

Soma de 1 a 100 em Haskell

Baseada na funo Sum e na ideia de lista implcita

s1_100:: integer
s1_100 = sum [1..100]

O mtodo de programao aplicao de funes


Conseqncia de abordagem funcional

s1_ 100 = sum [1..100]

Uma vez estabelecido o valor de s1 _ 100

tem um tipo definido o valor no pode ser mudado.


O valor pode ser usado como argumento de funes.
Em termos de c++, como se todos os valores fossem const

9. Vantagens de se trabalhar com o paradigma funcional

Programao funcional permite a codificao com menos potencial para erros, pois cada
componente completamente isolado. Alm disso, a recursividade usado em funes de
primeira-classe permite que as provas para correo sejam mais simples do que
normalmente espelhar a estrutura do cdigo.
Algumas das vantagens da programao funcional incluem o fato de que os programas
funcionais so mais curtos, e mais fceis de modificar (porque no h efeitos ocultos global
a ter em conta).
Manipulao mais simples de programas, boa legibilidade.
No permitir efeitos colaterais em funes, a linguagem oferece transparncia referencial
Modularidade, um conceito onde o sistema ou software divido em partes distintas.
Compe ferramentas necessrio para um programa mais legvel com uma melhor
manuteno e melhor desempenho por meio da programao.

10. Desvantagens de se trabalhar com o paradigma funcional

As linguagens funcionais tambm tendem a ter ambientes de execuo muito grande.


Haskell uma exceo (GHC executveis so quase to pequenos quanto programas C,
tanto em tempo de compilao e execuo), mas SML, Common Lisp, Scheme e programas
exigem sempre muita memria.
Os programas funcionais tendem a correr lentamente (por causa de todos copiando o que
tem que fazer), e eles tendem a no interagem bem com outros programas, processos do
sistema operacional.

11. Concluso

Com esse artigo podemos nos familiarizar com a programao funcional, vendo que a
mesma tem sido mais usada para pesquisas acadmicas que para a produo de software.
Percebemos que a programao funcional envolve escrever cdigos que no muda de
estado, que no h uma alocao de memria nem de variveis explicita. Foi observado que
este tipo de programao tem um menor potencial para erros, devido ser completamente
isolado cada componente, mas seu consumo de memria muito alto na maioria da
linguagem de programao funcional.

12. Referncias

[1] http://pt.wikipedia.org/wiki/Programao_funcional
[2] http://pt.wikipedia.org/wiki/Clculo_lombda
[3] http://www.cin.ufpe.br/~mrsl/PLC/02-Introducao_Haskell.pdf
[4] http://www.inf.ufrgs.br/gppd/disc/cmp134/trabs/T1/991/ProgFunc/pf.html
[5] Varejo, Flvio Miguel. Linguagens de programao: Java, C e C e outras : conceitos e
tcnicas. Rio de Janeiro: Elsevier, 2004
[6] |Valena, Jos Manuel; Barros, Jos Bernardo, Fundamentos da Computao, Livro II:
Programao Funcional. Universidade Aberta, 1999.
[7] http://informacaocomdiversao.blogspot.com/2009/02/paradigma-funcional.html
[8] http://pt.scribd.com/doc/45211091/Apostila-Lisp

Você também pode gostar