generalizações: map, fold, filter, e composição ©andré santos e marcelo d’amorim 2010
TRANSCRIPT
![Page 1: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/1.jpg)
Generalizações:Map, Fold, Filter, e Composição
©André Santos e Marcelo d’Amorim 2010
![Page 2: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/2.jpg)
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
![Page 3: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/3.jpg)
Padrão Recursivo Map
©André Santos e Marcelo d’Amorim 2010
doubleL :: [Int] -> [Int]doubleL [] = []doubleL (a:x) = (2*a) : doubleL x
![Page 4: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/4.jpg)
Padrão Recursivo Map
©André Santos e Marcelo d’Amorim 2010
doubleL :: [Int] -> [Int]doubleL [] = []doubleL (a:x) = (2*a) : doubleL x
doubleL = map doublesqrL = map sqr
![Page 5: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/5.jpg)
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
![Page 6: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/6.jpg)
mapmap :: (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
![Page 7: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/7.jpg)
Outra definição para map
map f l = [f a | a <- l]
©André Santos e Marcelo d’Amorim 2010
![Page 8: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/8.jpg)
Padrão Recursivo Fold
©André Santos e Marcelo d’Amorim 2010
sum:: [Int] -> Intsum [] = 0sum (a:x) = a + sum x
O que há de diferente entre sum e mult?
![Page 9: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/9.jpg)
sum:: [Int] -> Intsum [] = 0sum (a:x) = a + sum x
Padrão Recursivo Fold
©André Santos e Marcelo d’Amorim 2010
![Page 10: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/10.jpg)
sum:: [Int] -> Intsum [] = 0sum (a:x) = a + sum x
Padrão Recursivo Fold
©André Santos e Marcelo d’Amorim 2010
sum = fold (+) 0mult = fold (*) 1
![Page 11: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/11.jpg)
Exemplo: folding
and :: [Bool] -> Booland = fold (&&) True
concat :: [[t]] -> [t]concat = fold (++) []
maximum :: [Int] -> Intmaximum = fold maxi 0
©André Santos e Marcelo d’Amorim 2010
![Page 12: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/12.jpg)
Exemplo: folding
fold (||) [False, True, True]
fold (++) [“Bom“, “ “, “Dia“]
fold min [6]
fold (*) [1..6]
©André Santos e Marcelo d’Amorim 2010
![Page 13: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/13.jpg)
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
![Page 14: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/14.jpg)
foldr::(t -> u -> u) -> u -> [t] -> u
foldr
foldr f s [] = sfoldr f s (a:as) = f a (foldr f s as)
concat :: [[t]] -> [t]concat xs = foldr (++) [] xs
and :: [Bool] -> Booland bs = foldr (&&) True bs
©André Santos e Marcelo d’Amorim 2010
![Page 15: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/15.jpg)
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 ?
![Page 16: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/16.jpg)
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
![Page 17: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/17.jpg)
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
![Page 18: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/18.jpg)
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 -> Stringdigits st = filter isDigit stletters st = filter isLetter stevens xs = filter isEven xs where isEven n = (n ‘mod‘ 2 == 0)
©André Santos e Marcelo d’Amorim 2010
![Page 19: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/19.jpg)
Outra definição para filter
filter p l = [a | a <- l, p a]
©André Santos e Marcelo d’Amorim 2010
![Page 20: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/20.jpg)
Exemplo: Biliotecabooks :: 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 dbwhere notPB pr = (pr /= (p,b))
©André Santos e Marcelo d’Amorim 2010
![Page 21: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/21.jpg)
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
![Page 22: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/22.jpg)
COMPOSIÇÃO
©André Santos e Marcelo d’Amorim
![Page 23: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/23.jpg)
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)
![Page 24: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/24.jpg)
• (f . g) x = f (g x)
Ilustração
u vg f
g >.> f
t
f . g
![Page 25: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/25.jpg)
Exemplo 1
©André Santos e Marcelo d’Amorim
splitWords :: String -> [Word]splitLines :: [Word] -> [Line]fill = splitLines . splitWords
![Page 26: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/26.jpg)
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
![Page 27: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/27.jpg)
Composição de funções
• Qual o tipo do operador . ?
©André Santos e Marcelo d’Amorim
![Page 28: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/28.jpg)
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!
![Page 29: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/29.jpg)
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
![Page 30: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/30.jpg)
©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
![Page 31: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/31.jpg)
Pre-definidas...
(+2)(2+)(>2)(3:)(==0)
![Page 32: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/32.jpg)
Exercício
• Escreva a função getEvens usando apenas filter, ==0, mod, e composição.
©André Santos e Marcelo d’Amorim
![Page 33: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/33.jpg)
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))
![Page 34: Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010](https://reader035.vdocuments.net/reader035/viewer/2022062818/570638451a28abb8238f2d1b/html5/thumbnails/34.jpg)
Explique comportamento...
(++ “\n“)map (+1) >.> filter (>0)double = map (*2)books db per = map snd (filter ((==per).fst db)