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

Slides:



Advertisements
Apresentações semelhantes
TIPOS ABSTRATOS DE DADOS
Advertisements

Departamento de Informática Universidade Federal do Espírito Santo
Departamento de Informática Universidade Federal do Espírito Santo
Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekoken 2010/1.
Funções em C Prof. Fabiano Utiyama.
Técnicas de Programação II Revisão TP1 Parte2
Programação em Java Prof. Maurício Braga
Haskell The Craft of Functional Programming Simom Thompson Capítulo 14
Input/Output em Haskell
Soluções Iterativas com Laços
Programação em Java Prof. Maurício Braga
V Procedimentos – são estruturas que agrupam um conjunto de comandos, que são executados quando o procedimento é chamado. v Funções – são procedimentos.
Programação Funcional
Introdução à Programação: uma Abordagem Funcional PD I – Engenharia Elétrica Prof.ª Claudia Boeres 2008/2.
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro.
Departamento de Informática Universidade Federal do Espírito Santo
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro.
Listas duplamente encadeadas
Elsa Carvalho 49 Universidade da Madeira Departamento de Matemática e Engenharias Programação em Lógica e Funcional (2000/01) (Actualizado em 2005/06)
Algoritmos e Estrutura de Dados I
Rafael Pinto Frederico Corrêa
Funções em C Universidade do Estado de Santa Catarina
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Estrutura de Dados em Java
Linguagem Haskell Riocemar S. de Santana.
CAPÍTULO 05 Listas.
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Sub-programas. Mecanismo de composição de programas Sub-programa está para peça de LEGO assim como um programa está para a construção.
1 Funções (versão C) Funções são pedaços de código encapsulados para fácil acesso. Em C e C++ o processo de construção de uma função passa por 2 etapas.
1 Ponteiros Ponteiros são variáveis que guardam localizações em memória. A declaração de uma variável ponteiro x para um dado tipo type é type *x; Essa.
Haskell.
Listas: Haskell x Prolog
Programação Funcional
Programação II Estruturas de Dados Aula 02 - continuação
Haskell Programação Funcional
©André Santos, Programação Funcional Generalizações André Santos.
©André Santos, Programação Funcional Classes em Haskell André Santos.
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Paradigma Funcional Apresentação de LF1.
Centro de Informática – UFPE
© André Santos Programação Funcional Listas André Santos.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
3. Introdução à Linguagem C
Modularização Dividir um problema em subproblemas Módulos menores facilita a depuração Dividir o desenvolvimento entre vários programadores “Reutilização”
Haskell :: Funções como valores George Darmiton da Cunha Cavalcanti Monitores: Bruno Barros cin.ufpe.br) Glerter Sabiá (gas2.
Funções Matemáticas e de String
Cálculo Lambda (l – Calculus)
Conversão de Tipos Exemplo: x + i, onde x é do tipo real e i é do tipo integer. A especificação da linguagem deve indicar se a linguagem suporta este tipo.
Programação Funcional
Lambda Cálculo & Programação Funcional
Teste de Software 14: Geração de teste baseado em modelos: MBT
George Darmiton da Cunha Cavalcanti
Linguagens Funcionais: Haskell Prática 1 Paradigmas de Linguagens Computacionais Monitor: Guilherme Moura
Faculdade Pernambucana - FAPE Setembro/2007
Aula Prática 3 Funções Monitoria Introdução à Programação.
Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010.
Programação Funcional > FUNÇÕES COMO VALORES Monitor: Guilherme Moura Paradigmas de Linguagens Computacionais.
Haskell Programação Funcional Diego Lima Rubem Moreira.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
©André Santos, Programação Funcional Tipos Algébricos André Santos.
©André Santos, Programação Funcional Funções como valores André Santos.
Haskell Programação Funcional Diego Lima Rubem Moreira.
Informática e Computação Aula Estrutura de Repetição
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Haskell (é uma função polimorfica) Laboratório Rafael Borges
Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista POO para Redes de Computadores.
Arrays Outline 7.1 Introdução 7.2 Arrays 7.3 Declarando e Criando Arrays 7.4 Exemplos usando arrays 7.5 Ordenando arrays 7.6 Procurando em.
©André Santos, Programação Funcional André Santos.
© André Santos e Marcelo d'Amorim
Transcrição da apresentação:

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

FUNÇÕES DE ALTA ORDEM ©André Santos e Marcelo d’Amorim

Funções de alta ordem Funções como argumentos ou resultado de outras funções ©André Santos e Marcelo d’Amorim

Por que funções de alta ordem? Modularidade! –Separa conceitos –Facilita reuso com composição de funções ©André Santos e Marcelo d’Amorim

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

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

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

POLIMORFISMO ©André Santos e Marcelo d’Amorim

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.

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

Qual o tipo de zip ? zip (a:as) (b:bs) = (a,b):zip as bs zip _ _ = [] ©André Santos e Marcelo d’Amorim

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

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

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>

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

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

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

OVERLOADING ©André Santos e Marcelo d’Amorim

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

EXPRESSÃO LAMBDA ©André Santos e Marcelo d’Amorim

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

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

Expressão Lambda ( \ e -> ) ©André Santos e Marcelo d’Amorim addNum :: Int -> (Int -> Int) addNum n = ( \ m -> n + m) Outra definição para addNum

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

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

CURRIFICAÇÃO E APLICAÇÃO PARCIAL ©André Santos e Marcelo d’Amorim

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

Exemplo ©André Santos e Marcelo d’Amorim multiply :: Int -> Int -> Int multiply x y = x * y

Exemplo ©André Santos e Marcelo d’Amorim multiply :: Int -> (Int -> Int) multiply x y = x * y -> associa a direita! Resto do cálculo

Avaliação Parcial ©André Santos e Marcelo d’Amorim multiply 2 (multiply 2) 5 Quais os tipos?

Avaliação Parcial ©André Santos e Marcelo d’Amorim multiply 2 :: Int -> Int (multiply 2) 5 :: Int

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

Associatividade f a b = (f a) b t -> u -> v = t -> (u -> v)

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

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.

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