Está en la página 1de 20

Universidade de So Paulo

Instituto de Cincias Matemticas e de Computao


Departamento de Cincias de Computao

SCC0217 - Linguagens de Programao e Compiladores

Paradigma Funcional

Alexis Ivn Aspauza Lescano - 9249525


Carlos Eduardo Plasencia Prado - 9250472

Professor:
Diego Raphael Amancio
Estagirios PAE:
Paola Llerena Valdivia
Erick Rocha Fonseca

Maio de 2015

Introduo
Existem diversos paradigmas de programao e diversas linguagens associadas a
estes paradigmas, e este trabalho ir enfatizar o paradigma de programao
funcional, Alm disso, vemos tambm duas linguagens que seguem este paradigma,
Lisp e Haskell.
Neste trabalho vamos discutir a linguage funcional, suas caractersticas e
benefcios, com o objectivo de familiarizar os estudantes com uma linguagem
elegante, que pode lidar com mais facilidade e para que os programas so menos
extensa e complexa. tambem vamos discutir sobre o objectivo do paradigma
funcional que obter uma linguagem expressiva e matematicamente elegante, que
no necessrio diminuir o nvel da mquina para descrever o processo realizado
pelo programa.

NDICE
Crtula....1
Introduo .2
CAPITULO I - Paradigma Funcional
1.1 Noo de paradigma...4
1.2 Paradigmas e Linguagens de programao...5
1.3 Paradigma funcional...6
CAPITULO II - Linguagem LISP
2.1 A linguagem Lisp.8
2.2 Funes primitivas..9
2.3 Predicados..10
2.4 Recursividade.10
2.5 Estruturas de controle11
2.6 Arrays e Listas14
CAPITULO III - Linguagem Haskell
3.1 A linguagem Haskell..15
3.2 Funes primitivas.15
3.3 Predicados..16
3.4 Recursividade.17
3.5 Estruturas de controle17
3.6 Listas....17
BIBLIOGRAFIA.19

CAPITULO I - PARADIGMA FUNCIONAL


1.1 Noo de paradigma:
Primeiramente precisamos definir o que que um paradigma, ento, podemos ver as
prximas definies:
i) Um paradigma aquele que serve como um padro ou modelo. [1]
ii) Um conjunto ou lista de todas as formas inflexivas de uma palavra ou de uma de seus
categorias gramaticais. Exemplo: o paradigma de um verbo irregular. [1]
iii) Um conjunto de suposies, conceitos, valores e prticas que constituem uma forma de
ver a realidade pela semelhana que compartem, especialmente numa disciplina intelectual.
[1]
iv) Um paradigma um exemplo, um modelo, um padro. [2]
v) Uma ilustrao, como por uma parbola ou fbula. [2]
Mas de todas estas definies, ficam permanentes as palavras modelo e padro, e j temos
a noo do que um paradigma, ento vamos dizer que um paradigma um modelo, uma
forma de fazer algo, um conjunto de conceptos, e quem siga o mesmo padro, estar
seguindo o paradigma.

Figura 1.1: Linguagens, paradigmas e conceitos [3]

1.2 Paradigmas e Linguagens de programao:


Tem menos paradigmas que linguagens de programao, porque como sabemos, os
paradigmas so queins engloban os conceitos a seguir, e as linguagens so as que realizan
um ou mais paradigmas, e cada paradigma (de programao) definido por um conjunto de
conceitos de programao organizados numa linguagem nucleo, chamada kernel
language, linguagem kernel ou kernel da linguagem. Podemos ver a representao dissto
na figura 1.1. [3]
Ainda quando existem mais linguagems de programao que paradigmas, existem muitos
paradigmas, na figura 1.2 mostramos 27 paradigmas que so usados, no vamos a detalhar
cada um deles, mas podemos observar que cada paradigma no uma ilha, pois pode
compartir coisas do outros paradigmas, e absorver algumos conceitos deles (cada flecha
algo que tem que agregar para ir de um paradigma a outro). Veja uma descrio completa
em [3:13].

Figura 1.2: Taxonoma dos paradigmas de programao [3]

1.3 Paradigma Funcional ou programao funcional


A origem deste paradigma pode ser atribuda a matemtico Alonzo Church, que trabalhou
na Universidade de Princeton. Church desenvolveu uma linguagem abstrata, chamado
clculo lambda (podemos ver um exemplo na Figura 1.3).
Seus fundamentos foram a base de toda a teoria da programao funcional e linguagens
funcionais desenvolvido mais tarde. Pode-se dizer que as linguagens funcionais modernos
so verses do clculo lambda com numerosos auxlios sinttica.

Figura 1.3 calculo lambda


Na programao funcional pura as variveis no so necessrias, contrariamente ao
paradigma imperativo, no necessita de espao de memria, podemos ver as diferencias de
os modelos destos paradigmas na figura 1.4.
Programas escritos em uma linguagem funcional so constitudas unicamente por
definies de funes, ou seja, no como subprogramas clssicas de uma linguagem
imperativa, mas como funes puramente matemticas, em que certas propriedades, tais
como transparncia referencial so verificados (o significado de uma expresso depende
apenas o significado dos seus subexprees), e, por conseguinte, a total falta de efeitos
secundrios.
Vantagens da utilizao de um paradigma funcional:
Entre as vantagens citadas comumente utilizando um paradigma funcional em programao
de computadores, so os seguintes:

A ausncia de efeitos secundrios


Processo de purificao menos problemtico
Unidades de teste mais confiveis
Mais fcil para a execuo simultnea

Hoje existem muitas linguagens funcionis:


Lisp Pode ser considerado como uma das primeiras linguagens funcionis
(falaremos sobre isso no captulo 2), que atualmente ainda esta em uso,
especialmente nas reas de inteligncia artificial.
Um pioneiro desse paradigma APL desenvolvido na dcada de 60 (Iverson de
1962).

A linhagem funcional enriquecido na dcada de 70, com a contribuio de Robin


Milner, da Universidade de Edimburgo para criar a linguagem ML. Este foi
subdividido em vrios dialetos como o Objective Caml e Standard ML.
No final dos anos 80, de uma comisso, a linguagem Haskell foi criado em uma
tentativa de reunir vrias idias espalhadas em diferentes linguagens funcionais
(tentar padronizar o paradigma, falaremos sobre isso no captulo 3).
Em 2008 Microsoft Research tem includo uma nova linguagem (funcional), chamado
de F #, sua plataforma .NET.
.

Figura 1.4 Comparacin entre los modelos imperativo y funcional (Labra 98).

CAPITULO II - Linguagem LISP


2.1 A linguagem Lisp
LISP um acrnimo para Lista de Processamento de Linguagem, uma linguagem de
programao de alto nvel desenvolvida por John McCarthy no MIT no final dos anos
cinquenta e incio dos anos sessenta.[4]

LISP uma linguagem dinmica, cujos programas so constitudos por pequenos mdulos,
de funcionalidade genrica e que cumprem um objectivo muito simples. a sua
combinao que produz um programa completo.
A linguagem Lisp nasceu como uma ferramenta matemtica, independente de qualquer
computador e s posteriormente se procedeu sua adaptao a uma mquina.[5]
Lisp projetado principalmente para processamento de dados simblicos. Ela tem sido
usada para clculos simblicos em clculo diferencial e integral, teoria circuito eltrico,
lgica matemtica, e outros campos da inteligncia artificial.[4]
Objetos de dados:
Tipos de dados primitivos: tomos. Cada tomo tem uma lista de propriedades associada,
acessvel atravs do ponteiro que armazena o nome do tomo.
No se distinguem maisculas e minsculas para identificadores.
Tipos de dados estruturados: listas. Tm associado um ponteiro ao primeiro elemento (car)
e outro ao elemento seguinte (cdr). Uma lista vazia aponta a nil.
Para a atribuio se utiliza (set x val).
Representao e armazenamento:
Cada descritor de um objeto de dados proporciona tipo e atributos.
Nos dados estruturados (listas) tm-se somente ponteiros a primeiro e ao seguinte.

Figura 2.1 exemplo do programao em LISP

2.2 Funes primitivas


Em LISP, para poder realizar as chamadas de funes, usaremos o seguinte formato:
(Nome arg1 arg2 ... argN)
Onde nome o nome da funo o primeiro argumento arg1, arg2 o segundo argumento,
e assim por diante. Temos as siguientes funes:
A funo + recebe um nmero qualquer de argumentos e retorna a soma de todos eles. Se
houver zero argumentos, retorna 0 que o elemento neutro para a adio.

(+) => 0
(+ 3) => 3
(+ 3 5 6) => 14
A funo - subtrai do primeiro argumento todos os outros, exceto quando h s um
argumento: da ela retorna o oposto dele. um erro cham-la com zero argumentos.
(-) => ERRO
(- 3) => -3
(- 3 5) => -2
(- 3 5 6) => -8
A funo * recebe um nmero qualquer de argumentos e retorna o produto de todos eles.
Se houver zero argumentos, retorna 1 que o elemento neutro para a multiplicao.
(*) => 1
(* 3) => 3
(* 3 5) => 15
(* 3 5 6) => 90
A funo / divide o primeiro argumento sucessivamente por cada um dos outros, exceto
quando h s um argumento: da ela retorna o inverso dele.
(/) => ERRO
(/ 3) => 1/3
(/ 3 5) => 3/5
(/ 3 5 6) => 1/10
A funo CONS recebe dois argumentos e retorna uma nova caixa contendo estes
argumentos como componentes, na ordem dada. Exemplos:
(cons 'a 'b) => (A B)
(cons '1 '(a b)) => (1 A B)
A funo CAR retorna o primeiro componente de um cons. FIRST um sinnimo de CAR.
(car '(A (A B) E)) => A
(car '((A . 1).("ca".(x . 10.0)))) => (A . 1)
A funo CDR retorna o segundo componente de um cons. REST um sinnimo de CDR.
(cdr '(A (A B) E)) => ((A B) E)
(cdr '((A . 1).("ca".(x . 10.0)))) => (("ca" x . 10.0))

2.3 Predicados
Em Lisp podemos encontrar muitos predicados, em seguida, listamos algumos deles:
atom x, devolve True se x um tomo.

numberp x, devolve True se x um nmero.


greaterp x y, devolve True se x>y.
lessp x y, devolve True se x<y.
null x, devolve True ei x nulo.
and x y, devolve x and y.
or x y, devolve x or y.
not x, devolve not x.
eq x y, devolve True se x=y.

2.4 Recursividade
Recurso j existia como um conceito matemtico antes que Lisp; mas Lisp foi a primeira
linguagem de programao para apoi-lo.
Uma funo recursiva uma funo que se refere a si prpria. A ideia consiste em utilizar a
prpria funo que estamos a definir na sua definio.
Em todas as funes recursivas existe:

Um passo bsico (ou mais) cujo resultado imediatamente conhecido.


Um passo recursivo em que se tenta resolver um sub-problema do problema inicial.
Exemplo:

Figura 2.2 exemplo recursividade: torres de hanoi

2.5 Estruturas de controle


Condicionaes
if
semelhante em outros idiomas: (if (condio) (ento) (se no ))
Se a condio for verdadeira a expresso "ento" avaliada, se a condio for falsa, a
expresso "se no" ser avaliada.

Em Lisp destina-se a valor falso NIL, o que tambm significa lista vazia; o valor lgico
verdade T. Aqui esto algumas funes de comparao:
Exemplo con if:
> (set 'temperatura 28)
28
> (if (< temperatura 30) (set 'clima "templado") (set 'clima "caluroso"))
"templado"
When
semelhante ao if, apenas que no contempla o fato de executar alguma ao se a
condio for falsa, veja:
(when (condio) (tempo))
Quando a condio verdadeira, avalia a expresso em seguida.
> (set 'nome "Maria")
"Maria"
> (when (EQUAL nome "maria") (princ "te amo, vida"))
"te amo vida"
Cond
Ir avaliar determinada expresso verdadeira, dependendo da condio utilizada.
semelhante e tem a mesma funo que case ou select em outros idiomas.
exemplo:
(defun hacer-algo (temperatura)
(cond ((< temperatura 10) "assistir tv")
((< temperatura 30) "jogar ao futebol")
((< temperatura 40) "tomar helado")
((>= temperatura 40) "Vao a praia")))
> (hacer-algo 15)
"jogar ao futebol"
> (hacer-algo 36)
"tomar helado"
Case
Se voc quiser fazer uma deciso com base na comparao de uma varivel com um
conjunto conhecido de valores constantes, caso muitas vezes mais conciso do que cond.
Importante, a varivel no pode ser usado para comparar sequncias:
(defun elegir-cor (cor)
(case cor
(:rojo "rosa")
(:azul "tulipan")
(:verde "malvon")

(:lila "azucena")
(:amarelho "margarita")
(otherwise "Elija outra cor!..."))) ; outro caso
> (elegir-cor :lila)
"azucena"
Iteraes o bucles de programa
dolist
Sintaxis
(dolist (lista-inicializao) (corpo))
dolist recebe uma lista de inicializao e um corpo. A lista de inicializao conter uma
varivel de tomar os elementos de uma lista para cada iterao, a lista de elementos, e uma
varivel a ser retornado como um resultado.
(elemento lista-elementos resultado)
No corpo que far um loop para cada elemento na lista, e ele ir armazenar cada um
desses valores na varivel de elemento.
Um exemplo:
> (set 'resultado 1)
1
> (set 'lista-elementos '(2 3 5 7 11 13 17 19 23))
> (dolist (itens lista-elementos resultado)
(set 'resultado (* elemento resultado))) ;multiplica cada elemento da lista e acumulase no resultado
dotimes
semelhante ao DOLIST, apenas a varivel iterador ser sempre um nmero natural,
comeando com zero.
A sintaxe :
(dotimes (lista-inicializao) (corpo))
Onde (lista-inicializao) tem a forma:
(variavel-iteradora valor-mximo resultado)
O corpo vai ser avaliada sucessivamente, comeando a varivel iterador com um valor de 0
(zero), atingindo um valor mximo menos 1. Tal como no caso anterior, se o "resultado" for
omitido NIL devolvido no final do ciclo.
Exemplo:
> (dotimes (i 10) (format t "~s" i))

0123456789
Format imprime o valor da varivel de cada vez que o corpo avaliado, "~ s" pegue o valor
da varivel e imprime na tela.
Para ser mais bonito, ns imprimimos abaixo entre si e com tabulao:
> (dotimes (i 10) (format t "~% ~14t ~s" i))
"~%" equivale "enter"
"~14t" a tabulao
"~s" a varivel o que se imprime
Suponha que ns queremos obter a soma de (2 * i) 6-23 inclusive,
Fazemo-lo:
> (set 'sumatoria 0)
> (dotimes (i 18 somatoria) (set 'sumatoria (+ sumatoria (* 2 (+ i 6)))))
522
loop
A maneira mais fcil de fazer uma iterao fazendo um loop. Para sair do ciclo
necessrio o uso de um (return). (return) me ajuda a deixar qualquer iterao, obviamente
voc sempre us-lo e quando uma determinada condio satisfeita, usando um "if" ou
"when", por exemplo:
(set 'x 2)
(loop
(set 'x (+ x 1))
;incrementa x en um
(when (not (y-or-n-p "voc deseja continuar?")) (return)))
O "y-or-n-p" devolve T (True) quando voc pressionar "y" e NIL (false), onde "n"
pressionado. No nosso caso, sai do loop, usando o "return" onde "n" pressionado, ento a
funo precedida por "no" que nega o valor lgico.
do
o funcionamento mais complicado. Serve para usar diversas variveis iteradoras de uma
s vez, cada um com o seu prprio aumento.
Sua sintaxe :
(do ((lista-inicializao-1)
(lista-inicializao-2)
...........
(lista-inicializao-n))
(condio(expresses-verdade))
(expresses-falso))
Exemplo de do:
(do
((i 1 (+ i 1))

(Cores '("azul", "verde", "vermelho", "amarelo", "marrom", "laranja")(rest cores)))


((null cores) (format t "~% ~%Listo, barrilete csmico!"))
(format t "~% ~10t El cor ~s es ~10t ~s" i (first cores)))
Se a lista ainda no est vazia,o primeiro elemento da lista impresso.

2.6 Arrays e Listas


Arrays
A funo make-array faz um array. A funo aref acessa seus elementos. Todos os
elementos de um array so inicialmente setados para nil:
> (make-array '(3 3))
#2a((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL))
> (aref * 1 1)
NIL
> (make-array 4) ;1D arrays don't need the extra parens
#(NIL NIL NIL NIL)
ndices de um array sempre comeam em 0
Listas
As listas so um dos componentes fundamentais da linguagem Lisp. O nome da linguagem
, alis, uma abreviao de ``list processing''. Como iremos ver, as listas constituem uma
estrutura de dados extremamente flexvel.
Em Lisp, quando o segundo elemento de um cons outro cons, o Lisp escreve o resultado
sob a forma de uma lista:
> (cons 1 (cons 2 (cons 3 (cons 4 5))))
(1 2 3 4 . 5)
Uma lista vazia uma sequncia sem qualquer elemento e pode ser escrita como nil ou
ainda mais simplesmente ().
> (null nil) => t
> (null (cons 1 (cons 2 nil)))=>nil

CAPITULO III - Linguagem Haskell


3.1 A Linguagem Haskell:
A linguagem Haskell permite as funes processar um conjunto de dados (input) e gerar
uma salida (output) e sempre que o conjunto de dados fora a mesma, a sada tambm ser
a mesma, isto , segue os princpios do paradigma funcional. [8]
Mostramos na figura 3.1 s algumas companhias que usaram Haskell.

ABN AMRO

Um banco internacional. Usa haskell na


banca de investimento para medir o
risco de contraparte em carteiras de
derivativos financeiros

Anygma

Uma companhia startup. Desarrolha


ferramentas de criao de contedo
multimdia usando Haskell.

Amgen

Uma companhia biotecnolgica. Cria


modelos
matemticos
e
outras
complexas aplicaes em Haskell.

Intel

Desarrolho um compilador Haskell como


parte da pesquisa de ela em paralelismo
multinucleado a escala.

Microsoft

Usa Haskell para seu sistema de


serializao de produo, Bond.

Figura 3.1: Haskell na industria [9]


Haskell tem indeferena de tipo de dado, isso , se eu coloco a = 2 + 3, esta reconhece a
como uma variavel de tipo inteiro. [10]

3.2 Funes primitivas


Para definir uma funo s precisamos colocar nomeDaFuno p1 p2 = (se a
funao ocupa mais de uma linea, as seguintes tem que ter sangria) e para chamar, s
nomeDaFuno p1 p2.[11]
Agora vamos mostrar um exemplo, faremos uma funo pequena que calcule a distncia
entre dois pontos da reta ento definimos a funo: distancia x1 y1 x2 y2 =
sqrt((x1-x2)**2 + (y1-y2)**2) seguindo a sintaxes que mostramos antes.
Como nos fala Miran Lipovaa no seu livro [10], agora vamos guardar nossa funo num
arquivo .hs, chamemos de firstFunction.ls ento, e no momento de incluir nosso header,
vamos escrever o comando :l firstFunction e finalmente para executar a funo
vamos chamar com a mesma sintaxes que j conhecemos. A figura 3.2 mostra o exemplo
mencionado.

Figura 3.2: Exemplo de funao em Haskell

3.3 Predicados
Os predicados so uma parte vital de qualquer linguagem de programao, a parte que nos
permitir condicionar algumas aes com respeito a se o predicado verdadeiro ou falso,
para que na seguinte seco podamos ver as estruturas de controle.
Na figura 3.3 podemos ver os valores e operaes lgicas, e na figura 3.4 podemos ver as
comparaes numricas do haskell [11].
Valor booleano

Descrao

False

valor falso

not

not lgico

|| / &&

or/and lgico

True

valor verdadeiro
Figura 3.3: Valores e operaoes lgicas

Comparaao

Descriao

a >, <, >=, <= b

comparaao maior,
menor, maior igual,
menor igual

a ==, /= b

igual, diferente

a `compare` b

retorna 3 valores
(iguais, menor,
maior)

Figura 3.4: Comparaoes numricas

3.4 Recursividade
A recursividade em Haskell simples, os casos base tem que estar definidos na parte
superior da definio, vamos ver isso com um exemplo clssico do fatorial de um nmero.
fatorial 1 = 1
fatorial 0 = 1
fatorial x = x * fatorial(x-1)
J que a funo percorre de forma Top-Down, o primeiro que encontra so os casos bases.
Depois a mesma definio que com funes.
Naturalmente o que caracteriza a um programa recursivo e a chamada a ele mesmo, como
vemos no exemplo.

3.5 Estruturas de controle


Vamos mostrar as estruturas de controle com a sintaxe correspondente e tambm com a
descrio na figura 3.5.
if c then 4 else 5

Condicional simples

case val of
v1 ->
v2 ->
v_ ->

Condicional mltipla

catch a (\exn -> )

Exceo (catching)

throw

Exceo (throwing)

Figura 3.5: estruturas de controle em Haskell

3.6 Listas
Bom, agora estamos numa parte importante tambm, no Haskell os arrays so
armazenados como listas, ento no referiremos mais a eles como arrays seno como
listas. Uma lista j sabemos que um conjunto de dados do mesmo tipo, em haskell s e
colocar entre colchetes [] los elementos da lista, e si queremos armazenar eles, ento
vamos chamar ao let. Por exemplo, let firstFourNumbers = [1, 2, 3, 4]
justamente isso, uma lista dos primeiros 4 nmeros naturais.
Tambm vamos aclarar que nesta linguagem, uma cadeia uma lista de caracteres, como
exemplo considere que compiladores o mesmo que [c, o, m, p,
i, l, a, d, o, r, e, s]. [10]
Uma operao bsica com listas e a concatenao, para isso, e s colocar o operador ++,
por exemplo a sentena let myList = [1..50]++[51..1000] concatena uma lista de
nmeros desde 1 at 50 com outra lista que contem nmeros desde 51 at 1000, e tudo
numa lista nomeada myList.

Mas o operador ++ tem que percorrer toda a primeira lista, o qual poderia ser muito
complexo se contm um nmero alto de elementos, a outra opo o operador :, exemplo:
let myList = [1..50]:[51..1000] a qual face a referncia do ltimo elemento da
primeira ao incio da segunda. [10]
Na figura 3.6 podemos ver o fcil que declarar uma lista de listas.

Figura 3.6: Lista de listas


Temos que mencionar que existem muitas funes j definidas para strings e lists, podem
ser concultadas em [11:Strings] e [11:Bags and Lists], tambm pode ver exemplos em [10:7]

BIBLIOGRAFA:
[1] The American Heritage Dictionary of the English Language. 4th edn, Houghton Mifflin
Company, 2000
[2] Webster's Revised Unabridged Dictionary. Micra Inc., 1998.
[3] Programmging Paradigms for Dummies: What every programmer should Know. Peter
Van Roy
[4] McCarthy, John, LISP 1.5 Programmer's Manual, Massachusetts Institute of Technology,
Computation Center and Research Laboratory of Electronics, 1962
[5] Introduo Linguagem Lisp, Antnio Menezes Leito, Reviso de Joo Cachopo,
Outubro 1995.
[6] A linguagem de programao LISP o dialeto Common LISP, Tarcisio Praciano Pereira,
Sobral Matematica, 25 de fevereiro de 2013
[7] Programacin Lisp: Estructura de Control de Programa, consultado 15/05/2015 s 20:35.
URL: http://sobrelisp.blogspot.com.br/2013/01/estructura-de-control-de-programa.html
[8] Real World Haskell - Bryan OSullivan, John Goerzen, Don Stewart
[9] Haskell wiki, consultado 09/05/2015 s 15:35. URL:
https://wiki.haskell.org/Haskell_in_industry
[10] Learn You a Haskell for Great Good! - Miran Lipovaa
[11] Syntax across languages per languages: Haskell. consultado 10/05/2015 s 18:53.
URL: http://rigaux.org/language-study/syntax-across-languages-per-language/Haskell.html

También podría gustarte