A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010.

Apresentações semelhantes


Apresentação em tema: "Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010."— Transcrição da apresentação:

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)


Carregar ppt "Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010."

Apresentações semelhantes


Anúncios Google