Funções como Valor ©André Santos e Marcelo d’Amorim.
-
Upload
natan-gaspar -
Category
Documents
-
view
214 -
download
0
Transcript of Funções como Valor ©André Santos e Marcelo d’Amorim.
![Page 1: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/1.jpg)
Funções como Valor
©André Santos e Marcelo d’Amorim
![Page 2: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/2.jpg)
FUNÇÕES DE ALTA ORDEM
©André Santos e Marcelo d’Amorim
![Page 3: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/3.jpg)
Funções de alta ordem
• Funções como argumentos ou resultado de outras funções
©André Santos e Marcelo d’Amorim
![Page 4: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/4.jpg)
Por que funções de alta ordem?
• Modularidade!– Separa conceitos– Facilita reuso com composição de funções
©André Santos e Marcelo d’Amorim
![Page 5: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/5.jpg)
Exemplo: análise de vendas-- função de alta ordemtotal :: (Int->Int)-> Int -> Inttotal f 0 = f 0total f n = total f (n-1) + f n-- instanciaçõestotalSales n = total sales nsumSquares :: Int -> IntsumSquares n = total sq n
©André Santos e Marcelo d’Amorim
![Page 6: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/6.jpg)
Outros exemplos
maxFun :: (Int -> Int) -> Int -> IntmaxFun f 0 = f 0maxFun f n = maxi (maxFun f (n-1)) (f n)
zeroInRange :: (Int -> Int) -> Int -> BoolzeroInRange f 0 = (f 0 == 0)zeroInRange f n = zeroInRange f (n-1) || (f n == 0)
©André Santos e Marcelo d’Amorim
![Page 7: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/7.jpg)
Exercício
• Use a função maxFun e sales para implementar uma que retorna o maior número de vendas de uma semana de 0 a n semanas
maxSales :: Int -> Int
• Dada uma função, verificar se ela é crescente em um intervalo de 0 a n
isCrescent :: (Int -> Int) -> Int -> Bool
©André Santos e Marcelo d’Amorim
![Page 8: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/8.jpg)
POLIMORFISMO
©André Santos e Marcelo d’Amorim
![Page 9: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/9.jpg)
Polimorfismo
• Função possui um tipo genérico; pode ser usada em várias situações
• Requer variáveis de tipos• Exemplo de tipo polimórfico:
©André Santos e Marcelo d’Amorim
(t,u) -> u
Tipo função que recebe um par e retorna um valor com mesmo tipo do segundo elemento do par.
![Page 10: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/10.jpg)
Exemplo
©André Santos e Marcelo d’Amorim
snd :: (t,u) -> usnd (_,y) = y
fst:: (t,u) -> tfst(x,_) = x
head:: [a] -> ahead a:_ = a
tail:: [a] -> atail _:x = x
![Page 11: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/11.jpg)
Qual o tipo de zip?
zip (a:as) (b:bs) = (a,b):zip as bs zip _ _ = []
©André Santos e Marcelo d’Amorim
![Page 12: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/12.jpg)
Qual o tipo de zip?
zip (a:as) (b:bs) = (a,b):zip as bs zip _ _ = []
©André Santos e Marcelo d’Amorim
zip :: [t] -> [u] -> [(t,u)]
![Page 13: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/13.jpg)
Polimorfismo
length [] = 0length (a:as) = 1 + length as
reverse [] = []reverse (a:as) = reverse as ++ [a]
id x = x
• Funções com várias instâncias de tipo©André Santos e Marcelo d’Amorim
![Page 14: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/14.jpg)
Polimorfismo
replicate 0 ch = []replicate n ch = ch : replicate (n-1) ch
• Hugs/Haskell: inferência de tipos
©André Santos e Marcelo d’Amorim
Main> :type replicate
Int -> a -> [a]
Main>
![Page 15: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/15.jpg)
Exercícios
• Defina as seguintes funções que coletam (take) ou descartam (drop) n elementos na cabeça de uma lista
take, drop :: Int -> [t] -> [t]
©André Santos e Marcelo d’Amorim
![Page 16: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/16.jpg)
Exercícios
• Defina a função takeWhile (resp., dropWhile) que coleta (resp., descarta) elementos enquanto uma condição de parada (função de entrada) é satisfeita:
takeWhile, dropWhile :: (t -> Bool) -> [t] -> [t]
©André Santos e Marcelo d’Amorim
![Page 17: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/17.jpg)
Exercícios
• Baseado nas definições de takeWhile e dropWhile (ver aula anterior) defina as seguintes funções:
getWord :: String -> StringdropWord :: String -> StringdropSpace :: String -> String
©André Santos e Marcelo d’Amorim
![Page 18: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/18.jpg)
OVERLOADING
©André Santos e Marcelo d’Amorim
![Page 19: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/19.jpg)
Tipo especial de polimorfismo
• Definição com mesmo nome
• Objetivo é o mesmo. Permitir que o mesmo nome seja usado em contextos diferentes
©André Santos e Marcelo d’Amorim
(==) :: Int -> Int -> Bool(==) :: Bool -> Bool -> Bool
![Page 20: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/20.jpg)
EXPRESSÃO LAMBDA
©André Santos e Marcelo d’Amorim
![Page 21: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/21.jpg)
Retornando uma função
• Vimos como escrever uma função que recebe outra como argumento.
• Ainda não aprendemos como escrever uma que retorna.
©André Santos e Marcelo d’Amorim
![Page 22: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/22.jpg)
Exemplo
• Função que recebe um inteiro e retorna outra que recebe um segundo inteiro e soma o primeiro.
©André Santos e Marcelo d’Amorim
addNum :: Int -> (Int -> Int)addNum n = addN where addN m = n + maddFour = addNum 4
![Page 23: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/23.jpg)
Expressão Lambda (\ e ->)
©André Santos e Marcelo d’Amorim
addNum :: Int -> (Int -> Int)addNum n = (\m -> n + m)
• Outra definição para addNum
![Page 24: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/24.jpg)
comp2 :: (t -> u) -> (u -> u -> v) -> (t -> t -> v)
comp2 f g = (\x y -> g (f x) (f y))
\x y -> g (f x) (f y)
y
f
f g
g (f x) (f y)
comp2x
![Page 25: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/25.jpg)
Exercício
• Dada uma função f do tipo t -> u -> v, defina uma expressão da forma
(\... -> ...) para uma função do tipo u -> t -> v
que se comporta como f mas recebe seus argumentos na ordem inversa
![Page 26: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/26.jpg)
CURRIFICAÇÃO E APLICAÇÃO PARCIAL
©André Santos e Marcelo d’Amorim
![Page 27: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/27.jpg)
Currificação
• Toda função em Haskell recebe exatamente 1 argumento!
• Quando mais de um é necessário, usa-se currying– Transfere para outra função o resto da
computação
©André Santos e Marcelo d’Amorim
![Page 28: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/28.jpg)
Exemplo
©André Santos e Marcelo d’Amorim
multiply :: Int -> Int -> Intmultiply x y = x * y
![Page 29: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/29.jpg)
Exemplo
©André Santos e Marcelo d’Amorim
multiply :: Int -> (Int -> Int)multiply x y = x * y
-> associa a direita!
Resto do cálculo
![Page 30: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/30.jpg)
Avaliação Parcial
©André Santos e Marcelo d’Amorim
multiply 2(multiply 2) 5
Quais os tipos?
![Page 31: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/31.jpg)
Avaliação Parcial
©André Santos e Marcelo d’Amorim
multiply 2 :: Int -> Int(multiply 2) 5 :: Int
![Page 32: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/32.jpg)
Avaliação Parcial
©André Santos e Marcelo d’Amorim
Main> multiply 2\m -> 2 * m Main>(multiply 2) 510
Hugs não consegue apresentar esta valor
![Page 33: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/33.jpg)
Associatividade
• f a b = (f a) b• t -> u -> v = t -> (u -> v)
![Page 34: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/34.jpg)
Funções Uncurried• Deseja-se obrigar passar todos argumentos simultaneamente• Usa-se produto cartesiano (tuplas)
©André Santos e Marcelo d’Amorim
multiplyUC :: (Int,Int) -> IntmultiplyUC (x,y) = x * y
![Page 35: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/35.jpg)
Exercício
©André Santos e Marcelo d’Amorim
uncurry :: (a -> b -> c) -> ((a,b) -> c)
• Defina a função uncurry, que transforma uma versão curried em uncurried.
![Page 36: Funções como Valor ©André Santos e Marcelo d’Amorim.](https://reader035.fdocument.pub/reader035/viewer/2022070507/570638461a28abb8238f2e58/html5/thumbnails/36.jpg)
Exercício
©André Santos e Marcelo d’Amorim
uncurry :: (a -> b -> c) -> (a,b) -> cuncurry f (x,y) = f x y
Definida em Prelude.hs