Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouNatan Gaspar Alterado mais de 9 anos atrás
1
Funções como Valor ©André Santos e Marcelo d’Amorim
2
FUNÇÕES DE ALTA ORDEM ©André Santos e Marcelo d’Amorim
3
Funções de alta ordem Funções como argumentos ou resultado de outras funções ©André Santos e Marcelo d’Amorim
4
Por que funções de alta ordem? Modularidade! –Separa conceitos –Facilita reuso com composição de funções ©André Santos e Marcelo d’Amorim
5
Exemplo: análise de vendas -- função de alta ordem total :: (Int->Int)-> Int -> Int total f 0 = f 0 total f n = total f (n-1) + f n -- instanciações totalSales n = total sales n sumSquares :: Int -> Int sumSquares n = total sq n ©André Santos e Marcelo d’Amorim
6
Outros exemplos maxFun :: (Int -> Int) -> Int -> Int maxFun f 0 = f 0 maxFun f n = maxi (maxFun f (n-1)) (f n) zeroInRange :: (Int -> Int) -> Int -> Bool zeroInRange f 0 = (f 0 == 0) zeroInRange f n = zeroInRange f (n-1) || (f n == 0) ©André Santos e Marcelo d’Amorim
7
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
8
POLIMORFISMO ©André Santos e Marcelo d’Amorim
9
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.
10
Exemplo ©André Santos e Marcelo d’Amorim snd :: (t,u) -> u snd (_,y) = y fst:: (t,u) -> t fst(x,_) = x head:: [a] -> a head a:_ = a tail:: [a] -> a tail _:x = x
11
Qual o tipo de zip ? zip (a:as) (b:bs) = (a,b):zip as bs zip _ _ = [] ©André Santos e Marcelo d’Amorim
12
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)]
13
Polimorfismo length [] = 0 length (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
14
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>
15
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
16
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
17
Exercícios Baseado nas definições de takeWhile e dropWhile (ver aula anterior) defina as seguintes funções: getWord :: String -> String dropWord :: String -> String dropSpace :: String -> String ©André Santos e Marcelo d’Amorim
18
OVERLOADING ©André Santos e Marcelo d’Amorim
19
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
20
EXPRESSÃO LAMBDA ©André Santos e Marcelo d’Amorim
21
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
22
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 + m addFour = addNum 4
23
Expressão Lambda ( \ e -> ) ©André Santos e Marcelo d’Amorim addNum :: Int -> (Int -> Int) addNum n = ( \ m -> n + m) Outra definição para addNum
24
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) comp2 x
25
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
26
CURRIFICAÇÃO E APLICAÇÃO PARCIAL ©André Santos e Marcelo d’Amorim
27
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
28
Exemplo ©André Santos e Marcelo d’Amorim multiply :: Int -> Int -> Int multiply x y = x * y
29
Exemplo ©André Santos e Marcelo d’Amorim multiply :: Int -> (Int -> Int) multiply x y = x * y -> associa a direita! Resto do cálculo
30
Avaliação Parcial ©André Santos e Marcelo d’Amorim multiply 2 (multiply 2) 5 Quais os tipos?
31
Avaliação Parcial ©André Santos e Marcelo d’Amorim multiply 2 :: Int -> Int (multiply 2) 5 :: Int
32
Avaliação Parcial ©André Santos e Marcelo d’Amorim Main> multiply 2 \ m -> 2 * m Main>(multiply 2) 5 10 Hugs não consegue apresentar esta valor
33
Associatividade f a b = (f a) b t -> u -> v = t -> (u -> v)
34
Funções Uncurried Deseja-se obrigar passar todos argumentos simultaneamente Usa-se produto cartesiano (tuplas) ©André Santos e Marcelo d’Amorim multiplyUC :: (Int,Int) -> Int multiplyUC (x,y) = x * y
35
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.
36
Exercício ©André Santos e Marcelo d’Amorim uncurry :: (a -> b -> c) -> (a,b) -> c uncurry f (x,y) = f x y Definida em Prelude.hs
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.