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

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

Embed Size (px)

Citation preview

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: