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

Programação Programação FuncionalFuncional

8a. Seção de Slides

Generalização em HaskellGeneralização em Haskell(2a. Parte)(2a. Parte)

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

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.

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

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

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

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]

1 .2 .3 .

1 .2 .3 .

times2, times3 :: Int -> Inttimes2 n = 2*ntimes3 n = 3*n

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

5

Map (aplicar sobre: mapear)1 .2 .3 .4 .

1 .2 .3 .4 .

isEven :: Int -> BoolisEven n | n `mod` 2 == 0 = True | otherwise = False

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

6

Map (aplicar sobre: mapear)

Main> map isEven [2,3,4][True,False,True]

Main> map isEven [2,3,4][True,False,True]

1 .2 .

1 .2 .

isEven :: Int -> BoolisEven n = (n `mod` 2 == 0)

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

7

Map (aplicar sobre: mapear)

Main> map small "ABC Esporte Clube""abc esporte clube"

Main> map small "ABC Esporte Clube""abc esporte clube"

1 .2 .3 .4 .5 .6 .

1 .2 .3 .4 .5 .6 .

offset = ord 'a' - ord 'A'isCapital ch = (ch >= 'A') && (ch <= 'Z')small :: Char -> Charsmall ch | isCapital ch = chr (ord ch + offset) | otherwise = ch

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

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

1 .2 .

1 .2 .

length [] = 0length (a:x) = 1 + length x

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

9

Map (aplicar sobre: mapear)

1 .2 .3 .

1 .2 .3 .

map :: (t -> u) -> [t] -> [u]map f [] = []map f (a:x) = f a : map f x

1 .2 .

1 .2 .

map :: (t -> u) -> [t] -> [u]map f l = [ f a | a <- l ]

• Definição:

• Alternativa:

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

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

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

11

Fold (“dobrar”, redução, resumir)

Main> fold (+) [1..3]6Main> fold (||) [False,True,False]TrueMain> fold (++) ["ABC"," Esporte", " ", "Clube"]"ABC Esporte Clube"Main> fold (-) [1..3]2

Main> fold (+) [1..3]6Main> fold (||) [False,True,False]TrueMain> fold (++) ["ABC"," Esporte", " ", "Clube"]"ABC Esporte Clube"Main> fold (-) [1..3]2

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

12

Main> fold maxi [2,4,3]4Main> fold maxi [2]2Main> fold maxi []ERRO!!!

Main> fold maxi [2,4,3]4Main> fold maxi [2]2Main> fold maxi []ERRO!!!

1 .2 .3 .4 .

1 .2 .3 .4 .

maxi :: Int -> Int -> Intmaxi a b | a > b = a | otherwise = b

Fold (“dobrar”, redução, resumir)

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

13

1 .2 .3 .

1 .2 .3 .

fold :: (t -> t -> t) -> [t] -> tfold f [a] = afold 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)

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

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] :

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

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] :

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

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.

1 .2 .3 .

1 .2 .3 .

fold :: (t -> u -> u) -> [t] -> ufold f [a] = afold f (a:b:x) = f a (fold f (b:x))

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

17

Fold (“dobrar”, redução, resumir)

1 .2 .3 .4 .5 .

1 .2 .3 .4 .5 .

fold1 :: (t -> u -> u) -> u -> [t] -> ufold1 f s [] = sfold1 f s (a:x) = f a (fold1 f s x)

sumListInt l = fold1 (+) 0 l

• Acrescentando um argumento a fold:

Main> sumListInt [1..3]6Main> sumListInt [3]3Main> sumListInt []0

Main> sumListInt [1..3]6Main> sumListInt [3]3Main> sumListInt []0

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

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ão p? ok

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

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ão p? ok

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

20

Filter (Filtrar)

Main> filter isEven [1..6][2,4,6]

Main> filter isEven [1..6][2,4,6]

1 .2 .

1 .2 .

isEven :: Int -> BoolisEven n = (n `mod` 2 == 0)

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

21

Filter (Filtrar)

Main> filter nonEmpty ["ABC","","Esporte Clube"]["ABC","Esporte Clube"]

Main> filter nonEmpty ["ABC","","Esporte Clube"]["ABC","Esporte Clube"]

1 .2 .

1 .2 .

nonEmpty :: String -> BoolnonEmpty st = (st /= "")

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

22

Filter (Filtrar)

1 .2 .3 .4 .5 .

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

• Definição:

1 .2 .

1 .2 .

filter :: (t -> Bool) -> [t] -> [t]filter p l = [ a | a <- l, p a ]

• Alternativa:


Recommended