Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMarcelo Souva Alterado mais de 9 anos atrás
1
Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010
2
Padrão Recursivo Map ©André Santos e Marcelo d’Amorim 2010 O que há de diferente entre doubleL e sqrL ? doubleL :: [Int] -> [Int] doubleL [] = [] doubleL (a:x) = (2*a) : doubleL x
3
Padrão Recursivo Map ©André Santos e Marcelo d’Amorim 2010 doubleL :: [Int] -> [Int] doubleL [] = [] doubleL (a:x) = (2*a) : doubleL x
4
Padrão Recursivo Map ©André Santos e Marcelo d’Amorim 2010 doubleL :: [Int] -> [Int] doubleL [] = [] doubleL (a:x) = (2*a) : doubleL x doubleL = map double sqrL = map sqr
5
A função de mapeamento Recebe como argumentos: –Uma função de transformação a ser aplicada a cada elemento da lista –a lista de entrada ©André Santos e Marcelo d’Amorim 2010
6
map map :: (t -> u) -> [t] -> [u] map f [] = [] map f (a:as) = f a : map f as snds :: [(t,u)] -> [u] snds xs = map snd xs map length [“abc“, “defg“] = ? ©André Santos e Marcelo d’Amorim 2010
7
Outra definição para map map f l = [f a | a <- l] ©André Santos e Marcelo d’Amorim 2010
8
Padrão Recursivo Fold ©André Santos e Marcelo d’Amorim 2010 sum:: [Int] -> Int sum [] = 0 sum (a:x) = a + sum x O que há de diferente entre sum e mult ?
9
sum:: [Int] -> Int sum [] = 0 sum (a:x) = a + sum x Padrão Recursivo Fold ©André Santos e Marcelo d’Amorim 2010
10
sum:: [Int] -> Int sum [] = 0 sum (a:x) = a + sum x Padrão Recursivo Fold ©André Santos e Marcelo d’Amorim 2010 sum = fold (+) 0 mult = fold (*) 1
11
Exemplo: folding and :: [Bool] -> Bool and = fold (&&) True concat :: [[t]] -> [t] concat = fold (++) [] maximum :: [Int] -> Int maximum = fold maxi 0 ©André Santos e Marcelo d’Amorim 2010
12
Exemplo: folding fold (||) [False, True, True] fold (++) [“Bom“, “ “, “Dia“] fold min [6] fold (*) [1..6] ©André Santos e Marcelo d’Amorim 2010
13
A função de folding Recebe como argumentos: –uma função de acumulação aplicada de forma incremental aos elementos da lista –um elemento neutro –a lista de entrada ©André Santos e Marcelo d’Amorim 2010
14
foldr::(t -> u -> u) -> u -> [t] -> u foldr foldr f s [] = s foldr f s (a:as) = f a (foldr f s as) concat :: [[t]] -> [t] concat xs = foldr (++) [] xs and :: [Bool] -> Bool and bs = foldr (&&) True bs ©André Santos e Marcelo d’Amorim 2010
15
Padrão Recursivo Filter ©André Santos e Marcelo d’Amorim 2010 evenL :: [Int]-> [Int] evenL [] = [] evenL (a:x) | isEven a = a::evenL x | otherwise = evenL x O que há de diferente entre evenL e gt10L ?
16
Padrão Recursivo Filter ©André Santos e Marcelo d’Amorim 2010 evenL :: [Int]-> [Int] evenL [] = [] evenL (a:x) | isEven a = a::evenL x | otherwise = evenL x
17
Padrão Recursivo Filter ©André Santos e Marcelo d’Amorim 2010 evenL :: [Int]-> [Int] evenL [] = [] evenL (a:x) | isEven a = a::evenL x | otherwise = evenL x evenL = filter isEven greater10L = filter gt10
18
Exemplo: filtrando filter :: (t -> Bool) -> [t] -> [t] filter p [] = [] filter p (a:as) | p a = a : filter p as | otherwise = filter p as digits, letters :: String -> String digits st = filter isDigit st letters st = filter isLetter st evens xs = filter isEven xs where isEven n = (n ‘mod‘ 2 == 0) ©André Santos e Marcelo d’Amorim 2010
19
Outra definição para filter filter p l = [a | a <- l, p a] ©André Santos e Marcelo d’Amorim 2010
20
Exemplo: Bilioteca books :: Database -> Person -> [Book] books db per = map snd (filter isPer db) where isPer (p,b) = (p == per) returnLoan :: Database -> Person -> Book -> Database returnLoan db p b = filter notPB db where notPB pr = (pr /= (p,b)) ©André Santos e Marcelo d’Amorim 2010
21
Exercícios Defina as seguintes funções sobre listas –Retornar a soma dos quadrados dos itens (fold) –Maior raiz quadrada de uma lista (map e fold) – Manter na lista todos os itens maiores que zero (filter) ©André Santos e Marcelo d’Amorim 2010
22
COMPOSIÇÃO ©André Santos e Marcelo d’Amorim
23
Composição de funções Similar ao comando pipe do Unix (mas ordem diferente) Semântica do operador. ©André Santos e Marcelo d’Amorim (f. g) x = f (g x)
24
Ilustração u v gf g >.> f t f. g
25
Exemplo 1 ©André Santos e Marcelo d’Amorim splitWords :: String -> [Word] splitLines :: [Word] -> [Line] fill = splitLines. splitWords
26
Exemplo 2 Dado Avaliação da expressão (twice succ) 12: = (succ. succ) 12 = succ (succ 12) = 14 twice :: (t -> t) -> (t -> t) twice f = f. f
27
Composição de funções Qual o tipo do operador. ? ©André Santos e Marcelo d’Amorim
28
Composição de funções Qual o tipo do operador. ? ©André Santos e Marcelo d’Amorim (.) :: (b -> c) -> (a -> b) -> (a -> c) Alta ordem e polimórfica!
29
Nota Aplicação tem bind mais forte que composição ©André Santos e Marcelo d’Amorim f. g x (f. g) x Não é o mesmo que
30
©André Santos, 1998-2002 Exemplo de Definições dropSpace = dropWhile (member whitespace) dropWord = dropWhile (not. member whitespace) getWord = takeWhile (not. member whitespace) member st x = elem x st
31
Pre-definidas... (+2) (2+) (>2) (3:) (==0)
32
Exercício Escreva a função getEvens usando apenas filter, ==0, mod, e composição. ©André Santos e Marcelo d’Amorim
33
Exercício Escreva a função getEvens usando apenas filter, ==0, mod, e composição. ©André Santos e Marcelo d’Amorim getEvens = filter ((==0).(‘mod‘ 2))
34
Explique comportamento... (++ “\n“) map (+1) >.> filter (>0) double = map (*2) books db per = map snd (filter ((==per).fst db)
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.