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

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

Funções como Valor ©André Santos e Marcelo d’Amorim.

Apresentações semelhantes


Apresentação em tema: "Funções como Valor ©André Santos e Marcelo d’Amorim."— Transcrição da apresentação:

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


Carregar ppt "Funções como Valor ©André Santos e Marcelo d’Amorim."

Apresentações semelhantes


Anúncios Google