Edl 03 Func
Edl 03 Func
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?
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.
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.
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.
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.
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)
Permite uso de variáveis que “casam” com qualquer valor
A variável pode ser usada na expressão de retorno
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
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", ...]
Estrutura de Linguagens
https://github.com/fsantanna-uerj/EDL/
Francisco Sant'Anna
[email protected]