aula 1 introdução - decom · introdução josé romildo malaquias departamento de computação...

32
1/32 Programação Funcional Aula 1 Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2

Upload: others

Post on 03-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

32/32

Fim