Programação Funcional

Slides:



Advertisements
Apresentações semelhantes
** Company Confidential **. 2 3 Selecionando as bases de dados a serem pesquisadas.
Advertisements

Nome Data Matemática 1 Observa alguns frutos do Outono. Efectua as operações. 2 Observa Quantas patas temos nós ? R : _________________________. 3 Observa.
ÁLGEBRA BOOLEANA Prof. Wanderley.
Para Casa – Montar o cariograma
AULA PRÁTICA DIRIGIDA Nº 02
Orientação a Objetos: Encapsulamento e Classificação
Recursividade Inhaúma Neves Ferraz
DIAGRAMA DE ATIVIDADES
DIAGRAMA DE CASOS DE USO PERSPECTIVA CONCEITUAL
BCC101 – Matemática Discreta
Classificação e Pesquisa de Dados
Rafael Pinto Frederico Corrêa
Arrays Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs.: Luciana Nedel, Júlio Machado e Bernardo Copstein) Arrays Exercícios.
Linguagem PHP Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
04(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
00(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
Auditoria de Segurança da Informação
Instrutor: Nilo Menezes
1 Aula 7 ImplementandoSubprogramas Universidade do Vale do Rio dos Sinos
Tratamento de Ficheiros
Revisão da Linguagem C.
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Introdução a Programação JAVA
Matemática I Prof. Gerson Lachtermacher, Ph.D.
AULA 4 Função Exponencial.
EXERCÍCIOS PARA GUARDA-REDES
Listas e algoritmos (em Scratch)
Calculada a solução óptima
Expressão algébrica a partir da representação gráfica da função
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Implementar Listas em Linguagem Funcional II
Estruturas de Dados com Jogos
Salas de Matemática.
Tipos Abstratos de Dados
Listas: Haskell x Prolog
Programação Funcional
Programação Funcional
As séries Orgânicas e as propriedades físicas dos compostos orgânicos
Conceitos de Lógica Digital
O Plano "Não basta destruir o que sobra;
EXERCÍCIOS PARA GUARDA-REDES
Haskell Programação Funcional
©André Santos, Programação Funcional Generalizações André Santos.
©André Santos, Programação Funcional Classes em Haskell André Santos.
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
© André Santos Programação Funcional Listas André Santos.
Rotação Simples e Dupla Katia Guimarães
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Programação em C++ Compiladores
Posição do estoque na data IdentificaçãoCOM_016 Data Revisão16/10/2013.
Vetor Prof. Guilherme Baião S. Silva Adaptações:
EFD – SPED FISCAL 1. Objetivos: O arquivo Sped Fiscal é uma obrigação fiscal e deve ser gerado mensalmente por alguns estabelecimentos. Esse arquivo deve.
Rio Verde - Goiás - Brasil
Cálculo da Direção de Caminhada: Gradiente de f(x)
Nome alunos 1 Título UC. Título – slide 2 Conteúdo Conteúdo 2.
Programação Funcional
George Darmiton da Cunha Cavalcanti
Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010.
Funções como Valor ©André Santos e Marcelo d’Amorim.
Haskell Programação Funcional Diego Lima Rubem Moreira.
©André Santos, Programação Funcional Funções como valores André Santos.
Haskell Programação Funcional Diego Lima Rubem Moreira.
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Haskell (é uma função polimorfica) Laboratório Rafael Borges
©André Santos, Programação Funcional André Santos.
Funções de Alta Ordem Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (
Transcrição da apresentação:

Programação Funcional Generalização em Haskell (2a. Parte) 8a. Seção de Slides

Polimorfismo e Ordem Mais Alta Importantes funções que são polimórficas e de ordem mais alta, simultaneamente: map (mapear: aplicar sobre) : uma lista L2 é criada a partir de uma lista L1, aplicando uma operação sobre cada elemento de L1; fold (redução) : um valor é calculado, resultado da aplicação de uma operação binária ao longo de toda uma lista de elementos; filter (filtrar): uma lista L2 é criada a partir de uma lista L1, selecionando alguns elementos de L1 que satisfazem a uma determinada propriedade. As funções map , fold e filter não impõem qualquer restrição sobre os tipos envolvidos.

Map (aplicar sobre: mapear) Uma lista L2 é criada a partir de uma lista L1, aplicando uma operação sobre cada elemento de L1. Não há restrição sobre o tipo dos elementos de L1, que ainda pode ser diferente do tipo dos elementos de L2. L1 = [ e1 , e2 , ... , ek ] L2 = [ f(e1) , f(e2) , ... , f(ek) ] f f f

Map (aplicar sobre: mapear) 1 . 2 . 3 . times2, times3 :: Int -> Int times2 n = 2*n times3 n = 3*n Main> map times2 [2,3,4] [4,6,8] Main> map times3 [2,3,4] [6,9,12]

Map (aplicar sobre: mapear) 1 . 2 . 3 . 4 . isEven :: Int -> Bool isEven n | n `mod` 2 == 0 = True | otherwise = False

Map (aplicar sobre: mapear) 1 . 2 . isEven :: Int -> Bool isEven n = (n `mod` 2 == 0) Main> map isEven [2,3,4] [True,False,True]

Map (aplicar sobre: mapear) 1 . 2 . 3 . 4 . 5 . 6 . offset = ord 'a' - ord 'A' isCapital ch = (ch >= 'A') && (ch <= 'Z') small :: Char -> Char small ch | isCapital ch = chr (ord ch + offset) | otherwise = ch Main> map small "ABC Esporte Clube" "abc esporte clube"

Map (aplicar sobre: mapear) 1 . 2 . length [] = 0 length (a:x) = 1 + length x Main> map length ["ABC","Esporte","Clube"] [3,7,5] Main> map length [2,3,4] ERRO DE TIPO!!!

Map (aplicar sobre: mapear) Definição: 1 . 2 . 3 . map :: (t -> u) -> [t] -> [u] map f [] = [] map f (a:x) = f a : map f x Alternativa: 1 . 2 . map :: (t -> u) -> [t] -> [u] map f l = [ f a | a <- l ]

Fold (“dobrar”, redução, resumir) Um valor é calculado, resultado da aplicação de uma operação binária ao longo de toda uma lista de elementos. Não há restrição sobre o tipo dos elementos da lista. fold f [ e1 ] = e1 fold f [ e1 , e2 , ... , ek ] = e1 `f` (e2 `f` (... `f` ek) ...) = f e1 (fold f [ e2 , ... , ek ])

Fold (“dobrar”, redução, resumir) Main> fold (+) [1..3] 6 Main> fold (||) [False,True,False] True Main> fold (++) ["ABC"," Esporte", " ", "Clube"] "ABC Esporte Clube" Main> fold (-) [1..3] 2

Fold (“dobrar”, redução, resumir) 1 . 2 . 3 . 4 . maxi :: Int -> Int -> Int maxi a b | a > b = a | otherwise = b Main> fold maxi [2,4,3] 4 Main> fold maxi [2] 2 Main> fold maxi [] ERRO!!!

Fold (“dobrar”, redução, resumir) Definição: 1 . 2 . 3 . fold :: (t -> t -> t) -> [t] -> t fold f [a] = a fold f (a:b:x) = f a (fold f (b:x)) Mas os tipos da definição podem ser mais gerais... Qual a restrição sobre o tipo da operação f que será executada ao longo da lista?

Fold (“dobrar”, redução, resumir) Supondo uma lista [e1,...,ek] de tipo [t] : fold f [ e1 , e2 , ... , ek ] = e1 `f` (e2 `f` (... `f` ek) ...) = f e1 (fold f [ e2 , ... , ek ]) tipo do primeiro argumento de f tem que ser t tipo do segundo argumento de f tem que ser o mesmo do valor de retorno de fold

Fold (“dobrar”, redução, resumir) Supondo uma lista [e1,...,ek] de tipo [t] : fold f [ e1 , e2, e3 ] = f e1 (fold f [ e2 , e3 ]) = f e1 (f e2 (fold f [ e3 ])) = f e1 (f e2 e3) tipo do valor de retorno de f deve ser o mesmo tipo do segundo argumento de f

Fold (“dobrar”, redução, resumir) Restrições: tipo do primeiro argumento de f tem que ser t, o tipo dos elementos da lista. tipo do segundo argumento de f tem que ser o mesmo tipo do valor de retorno de fold. tipo do valor de retorno de f deve ser o mesmo tipo do segundo argumento de f. 1 . 2 . 3 . fold :: (t -> u -> u) -> [t] -> u fold f [a] = a fold f (a:b:x) = f a (fold f (b:x))

Fold (“dobrar”, redução, resumir) Acrescentando um argumento a fold: 1 . 2 . 3 . 4 . 5 . fold1 :: (t -> u -> u) -> u -> [t] -> u fold1 f s [] = s fold1 f s (a:x) = f a (fold1 f s x) sumListInt l = fold1 (+) 0 l Main> sumListInt [1..3] 6 Main> sumListInt [3] 3 Main> sumListInt []

Filter (Filtrar) Uma lista L2 é criada a partir de uma lista L1, selecionando alguns elementos de L1 que satisfazem a uma determinada propriedade. Não há restrição sobre o tipo dos elementos de L1, mas é o mesmo tipo dos elementos de L2. L1 = [ e1 , e2 , ... , ek ] L2 = [ e1 , e2 , ... , ek ] p? ok p? não p? ok

Filter (Filtrar) Supondo uma lista [e1,...,ek] de tipo [t] , a propriedade p que é aplicada aos elementos da lista é do tipo: t -> Bool L1 = [ e1 , e2 , ... , ek ] L2 = [ e1 , e2 , ... , ek ] p? ok p? não p? ok

Filter (Filtrar) isEven :: Int -> Bool isEven n = (n `mod` 2 == 0) 1 . 2 . isEven :: Int -> Bool isEven n = (n `mod` 2 == 0) Main> filter isEven [1..6] [2,4,6]

Filter (Filtrar) nonEmpty :: String -> Bool 1 . 2 . nonEmpty :: String -> Bool nonEmpty st = (st /= "") Main> filter nonEmpty ["ABC","","Esporte Clube"] ["ABC","Esporte Clube"]

Filter (Filtrar) Definição: Alternativa: 1 . 2 . 3 . 4 . 5 . filter :: (t -> Bool) -> [t] -> [t] filter p [] = [] filter p (a:x) | p a = a : filter p x | otherwise = filter p x Alternativa: 1 . 2 . filter :: (t -> Bool) -> [t] -> [t] filter p l = [ a | a <- l, p a ]