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

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

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

Apresentações semelhantes


Apresentação em tema: "Programação Funcional 8a. Seção de Slides Generalização em Haskell (2a. Parte)"— Transcrição da apresentação:

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

2 2 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.

3 3 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

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

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

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

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

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

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

10 10 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 ])

11 11 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 Main> fold (+) [1..3] 6 Main> fold (||) [False,True,False] True Main> fold (++) ["ABC"," Esporte", " ", "Clube"] "ABC Esporte Clube" Main> fold (-) [1..3] 2

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

13 fold :: (t -> t -> t) -> [t] -> t fold f [a] = a fold f (a:b:x) = f a (fold f (b:x)) Definição: 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)

14 14 Fold (dobrar, redução, resumir) 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 Supondo uma lista [e1,...,ek] de tipo [t] :

15 15 Fold (dobrar, redução, resumir) 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 Supondo uma lista [e1,...,ek] de tipo [t] :

16 16 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 fold :: (t -> u -> u) -> [t] -> u fold f [a] = a fold f (a:b:x) = f a (fold f (b:x))

17 17 Fold (dobrar, redução, resumir) 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 Acrescentando um argumento a fold : Main> sumListInt [1..3] 6 Main> sumListInt [3] 3 Main> sumListInt [] 0 Main> sumListInt [1..3] 6 Main> sumListInt [3] 3 Main> sumListInt [] 0

18 18 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ãop? ok

19 19 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ãop? ok

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

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

22 22 Filter (Filtrar) filter :: (t -> Bool) -> [t] -> [t] filter p [] = [] filter p (a:x) | p a = a : filter p x | otherwise= filter p x Definição: filter :: (t -> Bool) -> [t] -> [t] filter p l = [ a | a <- l, p a ] Alternativa:


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

Apresentações semelhantes


Anúncios Google