0% acharam este documento útil (0 voto)
46 visualizações42 páginas

Edl 03 Func

O documento descreve os principais conceitos da programação funcional, incluindo: 1) Funções de primeira classe, funções puras e funções recursivas como pilares da programação funcional; 2) Listas encadeadas como principal estrutura de dados e funções como map, filter e fold para manipulação de listas; 3) Conceitos de Haskell como tipos paramétricos, inferência de tipos, listas, tuplas e pattern matching.

Enviado por

pedro paulo
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
46 visualizações42 páginas

Edl 03 Func

O documento descreve os principais conceitos da programação funcional, incluindo: 1) Funções de primeira classe, funções puras e funções recursivas como pilares da programação funcional; 2) Listas encadeadas como principal estrutura de dados e funções como map, filter e fold para manipulação de listas; 3) Conceitos de Haskell como tipos paramétricos, inferência de tipos, listas, tuplas e pattern matching.

Enviado por

pedro paulo
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 42

Programação Funcional

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Programação Funcional

int g = 0;
a = b * 2 int f (int x) {
x = a + b g++;
x = input() return x + g;
b = 10
b = 0 }
f(0);
f(0);
Imperativo vs Funcional

Comando vs Expressão

Sequência vs Dependência

Atribuição vs Definição
Programação Funcional

Funções de Primeira Classe

podem ser criadas, passadas, retornadas

Funções de Alta Ordem // funcional
t = { 10,1,5 }

recebem ou retornam funções table.sort(t,
function (v1,v2)

Funções Puras return v1 > v2
end
) -- {10,5,1}

sem efeito colateral

qualquer ordem de avaliação (inclusive em paralelo)

Funções Recursivas

auto referência
Exercícios
1. Sobre o conceito de “transparência referencial”...
• Explique esse conceito em uma frase com as suas próprias palavras.
• Quais são as principais vantagens de transparência referencial? Por quê essas
vantagens são possíveis?

2. Sobre funções recursivas…


• Dê exemplos de funções recursivas que você já tenha escrito em trabalhos e
projetos. (Faça uma busca rigorosa.) Por quê você optou por essa técnica?

3. Sobre funções de alta ordem...


• Dê exemplos de funções de alta ordem que você já tenha escrito ou usado em
trabalhos e projetos. (Faça uma busca rigorosa.) Por quê você optou por essa
técnica?

4. Sobre declarações múltiplas…


• O exemplo a seguir não adere ao modelo funcional pois possui duas
a = b * 2
declaração para a variável b. Mas o que deve acontecer quando o x = a + b
programador comete esse erro? b = 10
b = 0
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
O Básico


Listas encadeadas

principal estrutura de dados
struct node {
int val;
struct node* nxt;
};

Funções de nAlta
struct node* Ordem
= malloc(...)

 map
 filter
 fold (reduce)

http://atendesigngroup.com/blog/
Exercícios
1. Escreva um programa em C que represente a lista encadeada
[1,2,3,4].
• Use struct, ponteiros e malloc.

2. Escreva a função filter em Python usando recursão.


• A filter deve retornar uma nova lista.
• Use um nome diferente, ex. ffilter, pois filter já existe.

3. Escreva a função map em Python usando um comando de loop.


• A map deve alterar a lista existente.
• Use um nome diferente, por ex. fmap, pois map já está existe.

def ffilter (f, l): def fmap (f, l):


... ...
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
O Básico


Listas encadeadas

principal estrutura de dados


Funções de Alta Ordem
 map
 filter
 fold (reduce)

http://atendesigngroup.com/blog/
Fold - “Dobrar”
10 7 4 14 1 6

17 4 14 1 6

21 14 1 6

35 1 6

36 6 42
foldr - Dobra da dir para esq
10 7 4 14 1 6 0

10 7 4 14 1 6

10 7 4 14 7

42 10 7 4 21

10 32 10 7 25
foldr - Dobra da dir para esq
10 7 4 14 1 6 “”

++

10 7 4 14 1 “6”

++

10 7 4 14 “16”

“10741416” 10 7 4 “1416”

10 “741416”
10 7 “41416”
Exercícios
1.Sobre as funções foldl e foldr…
• Execute o passo-a-passo de ambas para as seguintes
chamadas:
• foldr (-) 0 [1,2,3,4]
• foldl (-) 0 [1,2,3,4]
• Essas funções são equivalentes? Por quê?
2.Dê 2 exemplos de usos reais para cada uma das
funções map, filter e fold.
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Haskell

GHC
 https://www.haskell.org/ghc/

Repl.it (GHC)
 https://repl.it/languages/haskell
Listas

Conjunto infinito de valores homogêneos

Principal mecanismo estrutural em linguagens funcionais

Imutáveis

Operações (em Haskell)

Literais: [1,2,3]

Construção: : -- m = 0 : [1,2,3]

Cabeça: head -- head m → 0

Cauda: tail -- tail m → [1,2,3]
 ++ last null length reverse
structtake
node drop
{ elem sort ...
 int val;
https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-List.html
struct node* nxt;
 https://wiki.haskell.org/How_to_work_on_lists
};
struct node* n = malloc(...)
Exercícios

Em todos os exercícios, sempre cite as suas fontes.

1. Use a função sort de Haskell em algum exemplo.


2. Crie um exemplo com listas.
• Use map, filter e fold.
3. Crie um exemplo com listas dentro de listas.
• Use map, filter e fold.
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Haskell

Estática com inferência de tipos

Tipos paramétricos
Exercícios

Em todos os exercícios, sempre cite as suas fontes.

1. Sobre Haskell vs Python...


• Considere os critérios externos e internos do vídeo 1.5.
• Considere os tempos de amarração do vídeo 2.2.
1. Compare a inferência de tipos de Haskell com a tipagem
dinâmica de Python.
2. Compare a tipagem paramétrica de Haskell com a tipagem
“pato” de Python (duck typing).
2. Quais são os problemas do tipo String de Haskell?
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Map

Transformador de listas

Função de alta ordem

Recebe uma função de transformação f e uma lista l

map f l

Retorna uma nova lista m de mesmo tamanho com
valores de tipos possivelmente diferentes

Aplica f a cada elemento de l, mapeando-os para novos
elementos em m

map :: (a → b) → [a] → [b]
f l m
Exercícios

Em todos os exercícios, sempre cite as suas fontes.

1. Implemente a função map em Haskell usando recursão.


2. Considere uma lista em que cada elemento é uma lista com três
inteiros representando os coeficientes a,b,c de uma equação de
segundo grau:
• l1 :: [[Int]]
l1 = [ [1,12,-13], [1,2,1], [2,-16,-18], ... ]
• Calcule uma nova lista com todas as raízes de todas as equações.
• A resposta de cada equação deve seguir o seguinte formato:
• []: nenhuma raíz
• [x]: 1 raíz x
• [x,y]: 2 raízes x e y
m1 = [ [1,-13], [], [9,-1], … ]
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Haskell

Tuplas

Pattern Matching (casamento de padrão)
Listas vs Tuplas

Lista

Conjunto infinito de valores homogêneos
 [1,2,3,…] :: [Int]

Tuplas

Conjunto finito de valores heterogêneos
 (“Joao”,25,True) :: (String,Int,Bool)

struct node { struct pessoa {


int val; char nome[255];
struct node* nxt; int idade;
}; bool masc;
}
Pattern Matching

if estrutural
case lista of case tup of
1 : 2 : [] -> ... (“Joao”, 25, True) -> ...
5 : 1 : 0 : [] -> ... (“Maria”, 10, False) -> ...
[] -> ...


Permite uso de variáveis que “casam” com qualquer valor

A variável pode ser usada na expressão de retorno

case lista of case tup of


1 : x -> {usa x} (“Joao”, x, y) -> {usa x e y}
y -> {usa y} (i, 10, _) -> {usa i}
Tuplas + Pattern Matching

type Pessoa = (String,Int,Bool)


struct pessoa { nome :: Pessoa -> String
char nome[255]; nome (x,_,_) = x
int idade;
bool masc; idade :: Pessoa -> Int
} idade (_,y,_) = y

masc :: Pessoa -> Bool


masc (_,_,z) = z
Exercícios
1. Crie um tipo novo para representar um Aluno com nome,
nota da P1 e nota da P2.
2. Crie uma lista com pelo menos 10 alunos. Usando a função
map…
1. Exiba uma lista com o nome de cada aluno.
2. Exiba uma lista com a média de notas de cada aluno.
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Filter

Filtro de listas

Função de alta ordem

Recebe uma função de filtro f e uma lista l

filter f l

Retorna uma nova lista m de no máximo mesmo tamanho
com valores do mesmo tipo

Aplica f a cada elemento de l, filtrando os que satisfizerem
f para novos elementos em m

filter :: (a → Bool) → [a] → [a]
f l m
Exercícios
• Considere o tipo Aluno com nome, nota da P1 e nota da P2.
Considere uma lista com pelo menos 10 alunos.
1. Exiba uma lista com somente o nome dos alunos aprovados
com média >= 7. Use filter e map.
Programação Funcional
(continuação...)

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Foldr

Agregador de listas

Função de alta ordem
 Recebe uma função de acumulação f, um valor inicial v0 e
uma lista l
 foldr f v0 l

 Retorna um valor qualquer vn do mesmo tipo de v0


 aplica f (ln , v0) → v1

f (ln-1 , v1) → v2

...
f (l1 , vn-1) → vn (que é o valor final)


foldr :: (a → b → b) → b → [a] → b
f v0 l vn
Exercícios
• Considere o tipo Aluno com nome, nota da P1 e nota da P2.
Considere uma lista com pelo menos 10 alunos.
1. Exiba a média da turma. Use map, foldr e length.
2. Exiba a quantidade de alunos aprovados.
3. Exiba a média dos alunos reprovados. Use map, filter,
foldr e length.
Programação Funcional

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Programação Funcional

Comando → Expressão

Sequência → Dependência

Atribuição → Definição

Funções…

de primeira classe

de alta ordem

puras

recursivas
Programação Funcional

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]
Exemplo
1. Somente o nome das músicas:
 ["Aquele Abraco", "Esperando na Janela", ...]

2. Somente músicas com >= 2min:


 [("Esperando...",1,150), ("Borboletas",2,120), ... ]
bandas :: [[String]]
3. Maior duração: bandas = [ ["Gilberto Gil"],
["Victor","Leo"],
 200 ["Gonzagao"],
["Claudinho","Bochecha"] ]
4. Nomes com >= 2min: type Musica = (String, Int, Int)
musicas :: [Musica]
 ["Esperando...", "Borboletas",,
musicas...
= [ ]
("Aquele Abraco", 0, 100),
("Esperando na Janela", 0, 150),
5. Bandas: ("Borboletas", 1, 120),
("Asa Branca", 2, 120),
 [["Gilberto Gil"],["Gilberto Gil"], ("Assum Preto", 2, 140),
("Vem Morena", 2, 200),
["Victor","Leo"], ("Nosso Sonho", 3, 150),
("Quero te Encontrar", 3, 100) ]
["Gonzagao"],["Gonzagao"],...]
Exercícios
• Considere a base de músicas e autores do slide anterior.
1. Exiba os nomes dos componentes de uma banda em uma
única string com os nomes separados por vírgula. Pode usar a
função intercalate.
2. Pretty-print das músicas:
• Nome: Borboletas
Autores: Victor, Leo
Duracao: 120
...
Programação Funcional

Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/

Francisco Sant'Anna
[email protected]

Você também pode gostar