Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação...
Transcript of Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação...
![Page 1: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/1.jpg)
1/32
Programação Funcional
Aula 1
Introdução
José Romildo Malaquias
Departamento de ComputaçãoUniversidade Federal de Ouro Preto
2011.2
![Page 2: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/2.jpg)
2/32
1 Programação Funcional
2 Algumas características de Haskell
3 Antecedentes históricos
4 Experimentando Haskell
![Page 3: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/3.jpg)
3/32
A Crise de Software
I Como podemos lidar com o tamanho e a complexidade dosprogramas de computador modernos?
I Como podemos reduzir o tempo e o custo de desenvolvimentodo programas?
I Como podemos aumentar nossa confiança de que os programasjá concluídos funcionam corretamente?
![Page 4: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/4.jpg)
4/32
Linguagens de Programação
Uma abordagem para a crise do software é a concepção denovas linguagens de programação que:
I permitam que programas sejam escritos de forma clara, concisa,e com um alto nível de abstração;
I suportem componentes de software reutilizáveis;
I incentivem o uso de verificação formal;
I permitam prototipagem rápida;
I forneçam poderosas ferramentas de resolução de problemas.
![Page 5: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/5.jpg)
5/32
Linguagens de Programação (cont.)
As linguagens funcionais fornecem um quadro particularmenteelegante para abordar estes objetivos.
![Page 6: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/6.jpg)
6/32
Função
I Função é um mapeamento de um ou mais argumentos em umresultado único.
I Em Haskell uma função é definida usando uma equação que dáum nome para a função, um nome para cada um de seusargumentos, e um corpo que especifica como o resultado podeser calculado em termos dos argumentos.
I Exemplo:Uma função chamada double que recebe um número x comoseu argumento, e produz o resultado x+ xdouble x = x + x
![Page 7: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/7.jpg)
7/32
Aplicação de função
I Quando uma função é aplicada aos argumentos reais, oresultado é obtido pela substituição desses argumentos no corpoda função no lugar dos nomes dos argumentos.
I Este processo pode produzir imediatamente um resultado quenão pode ser mais simplificado, como por exemplo um número.
I Mais comumente, no entanto, o resultado será uma expressãocontendo outras aplicações de função, que devem, então, serprocessadas da mesma maneira para produzir o resultado final.
![Page 8: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/8.jpg)
8/32
Aplicação de função (cont.)
I Exemplo:Apcação da função double no argumento 3double 3= { aplicando double }3 + 3= { aplicando + }6
![Page 9: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/9.jpg)
9/32
Aplicação de função (cont.)
I Exemplo:Aplicação aninhada de doubledouble (double 2)= { aplicando double interno }double (2 + 2)= { aplicando + }double 4= { aplicando double }4 + 4= { aplicando + }8
![Page 10: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/10.jpg)
10/32
Aplicação de função (cont.)
I Exemplo:Aplicação aninhada de double, calculada de outra maneiradouble (double 2)= { aplicando double externo }double 2 + double 2= { aplicando o primeiro double }(2 + 2) + double 2= { aplicando o primeiro + }4 + double 2= { aplicando double }4 + (2 + 2)= { aplicando o segundo + }4 + 4= { aplicando + }8
![Page 11: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/11.jpg)
11/32
Aplicação de função (cont.)
I Em geral, a ordem na qual funções são aplicadas em um cálculonão afeta o valor do resultado final, mas pode afetar o número depassos necessário, e pode afetar se o processo de cálculotermina.
![Page 12: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/12.jpg)
12/32
O que é uma linguagem funcional?
As opiniões divergem, e é difícil dar uma definição precisa, mas de ummodo geral:
I Programação funcional é um estilo de programação em que ométodo básico de computação é a aplicação de funções aargumentos.
I Uma linguagem funcional é aquela que apoia e incentiva oestilo funcional.
![Page 13: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/13.jpg)
13/32
O que é uma linguagem funcional? (cont.)
Exemplo:Somando os inteiros 1 a 10 em C:total = 0;for (i = 1; i < 10; ++i)
total = total + i;
I O método de cálculo é atribuição de variável.
I Em geral, linguagens de programação em que o método básicode computação consiste em mudar os valores armazenados emvariáveis são chamadas de linguagens imperativas, pois osprogramas nestas linguagens são construídos a partir deinstruções imperativas que especificam precisamente como ocálculo deve ser realizado.
![Page 14: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/14.jpg)
14/32
O que é uma linguagem funcional? (cont.)
Exemplo:Somando os inteiros 1 a 10 em Haskell:sum [1..10]
I O método de cálculo é aplicação de função.
![Page 15: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/15.jpg)
15/32
Algumas características de Haskell
I Programas concisos
I Sistema de tipos poderoso
I Compreensões de lista
I Funções recursivas
I Funções de ordem superior
I Efeitos monádicos
I Avaliação lazy
I Raciocínio sobre programas
![Page 16: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/16.jpg)
16/32
Antecedentes históricos
I Década de 1930:
Alonzo Church desenvolve o cálculo lambda, uma teoria defunções simples, mas poderosa.
![Page 17: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/17.jpg)
17/32
Antecedentes históricos (cont.)
I Década de 1950:
John McCarthy desenvolve Lisp, a primeira linguagem funcional,com algumas influências do cálculo lambda, mas mantendo asatribuições de variáveis.
![Page 18: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/18.jpg)
18/32
Antecedentes históricos (cont.)
I Década de 1960:
Peter Landin desenvolve ISWIM, a primeira linguagem funcionalpura, baseada fortemente no cálculo lambda, sem atribuições.
![Page 19: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/19.jpg)
19/32
Antecedentes históricos (cont.)
I Década de 1970:
John Backus desenvolve FP, uma linguagem funcional queenfatiza funções de ordem superior e raciocínio sobre programas.
![Page 20: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/20.jpg)
20/32
Antecedentes históricos (cont.)
I Década de 1970:
Robin Milner e outros desenvolvem ML, a primeira linguagemfuncional moderna, que introduziu a inferência de tipos e tipospolimórficos.
![Page 21: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/21.jpg)
21/32
Antecedentes históricos (cont.)
I Décadas de 1970 e 1980:
David Turner desenvolve uma série de linguagens funcionaiscom avaliação lazy, culminando com o sistema Miranda.
![Page 22: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/22.jpg)
22/32
Antecedentes históricos (cont.)
I 1987:
Um comitê internacional de pesquisadores inicia odesenvolvimento de Haskell, uma linguagem funcional lazypadrão.
![Page 23: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/23.jpg)
23/32
Antecedentes históricos (cont.)
I 2003:
O comitê publica o relatório Haskell 98, a definição de umaversão estável da linguagem Haskell.
![Page 24: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/24.jpg)
24/32
Antecedentes históricos (cont.)
I 2009:
O comitê publica o relatório Haskell 2010, uma revisão dadefinição da linguagem Haskell.
![Page 25: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/25.jpg)
25/32
Experimentando Haskell
sum :: Num a => [a] -> a
sum [] = 0sum (x:xs) = x + sum xs
sum [1, 2, 3]= { aplicando sum }1 + sum [2, 3]= { aplicando sum }1 + (2 + sum [3])= { aplicando sum }1 + (2 + (3 + sum [ ]))= { aplicando sum }1 + (2 + (3 + 0))= { aplicando + }6
![Page 26: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/26.jpg)
26/32
Experimentando Haskell (cont.)
f [] = []f (x:xs) = f ys ++ [x] ++ f zs
whereys = [a | a <- xs, a <= x]zs = [b | b <- xs, b > x]
?
![Page 27: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/27.jpg)
27/32
Experimentando Haskell (cont.)
f [x]= { aplicando f }f [] ++ [x] ++ f []= { aplicando f }[] ++ [x] ++ []= { aplicando ++ }[x]
![Page 28: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/28.jpg)
28/32
Experimentando Haskell (cont.)
f [3, 5, 1, 4, 2]= { aplicando f }f [1, 2] ++ [3] ++ f [5, 4]= { aplicando f }(f [] ++ [1] ++ f [2]) ++ [3] ++ (f [4] ++ [5] ++ f [])= { aplicando f, propriedade anterior }([] ++ [1] ++ [2]) ++ [3] ++ ([4] ++ [5] ++ [])= { aplicando ++ }[1, 2] ++ [3] ++ [4, 5]= { aplicando ++ }[1, 2, 3, 4, 5]
![Page 29: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/29.jpg)
29/32
Experimentando Haskell (cont.)
I O tipo de f éf :: Ord a => [a] -> [a]
I Dada uma lista xs, f xs é a lista formada pelos elementos de xsem ordem crescente.
I f implementa o algoritmo de ordenação quick sort.
![Page 30: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/30.jpg)
30/32
Exercícios
Exercício 1
Dê outro cálculo possível para o resultado de double (double 2).
Exercício 2
Mostre que sum [x] = x para qualquer número x.
Exercício 3
Defina uma função product que produza o produto de uma lista denúmeros, e mostre, usando sua definição, queproduct [2,3,4] = 24
Exercício 4
Mostre como a definição da função qsort deve ser modificada paraque ela produza uma versão de uma lista ordenada em ordemdecrescente.
![Page 31: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/31.jpg)
31/32
Exercícios (cont.)
Exercício 5
Qual é o efeito de trocar <= por < na definição de qsort? Dica:considere o exemplo qsort [2,2,3,1,1].
![Page 32: Aula 1 Introdução - DECOM · Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2. 2/32 1 Programação Funcional 2 Algumas](https://reader033.fdocuments.net/reader033/viewer/2022050414/5f8b2dc3d927f6392c5d08f2/html5/thumbnails/32.jpg)
32/32
Fim