Funções de Alta Ordem Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (http://www.cs.nott.ac.uk/~gmh/book.html)http://www.cs.nott.ac.uk/~gmh/book.html.

Slides:



Advertisements
Apresentações semelhantes
Programação Funcional
Advertisements

Projeto de Programação Departamento de Informática – CT XVII Engenharia de Computação Programação I /1 Maria Claudia Boeres MOONLANDER Hudson Martins.
Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 13 Criado por Frederick H. Colclough, Colorado Technical University Recursão.
Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 5 Criado por Frederick H. Colclough, Colorado Technical University Vetores.
TXL Problema de Transformação Cminus. Tópicos Problema TXL o Estrutura de um programa o Definição da gramática o Regras de transformação Possível solução.
Python: Recursão Claudio Esperança.
Programação Funcional
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro.
Recursividade Prof. Rosana Palazon.
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)
Funções, Execução Condicional, Recursividade e Iteração
Tipos de igualdade X = Y é verdadeiro se X é igual a Y. X is E é verdadeiro se X é a avaliação da expressão E. E1 =:= E2 é verdadeiro se a avaliação da.
Programando com Alice Tim Margush Department of Computer Science University of Akron © 2006.
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
LISP – Uma Introdução Claudio Esperança.
BCC101 – Matemática Discreta
Rafael Pinto Frederico Corrêa
04(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
Introdução ao -calculus
7 Abstração Genérica Unidades genéricas e instanciação.
Instrutor: Nilo Menezes
Robson Godoi / Sandra Siebra
Minimização de Circuitos Lógicos
Otavio Bergmann e Raphael Miollo Parte 2 – Investigação e apresentação.
Informática Teórica Engenharia da Computação
LISTAS Uma lista é uma estrutura de dados muito comum na programação não numérica (com particular destaque na computação simbólica onde representa quase.
LISTAS Uma lista é uma estrutura de dados muito comum na programação não numérica (com particular destaque na computação simbólica onde representa quase.
Funções Declaração function nomedafunção (arg_1, arg_2,..., arg_n) corpoDaFunção end.
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Informática Teórica Engenharia da Computação
©André Santos, Programação Funcional Generalizações 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:
© André Santos Programação Funcional Listas André Santos.
5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP 5COP101 Linguagens de Programação Aula 3 Clojure/LISP Prof. Dr. Sylvio Barbon Junior 1Sylvio.
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;
Paradigma funcional.
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Métodos Formais.
Elsa Carvalho 18 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Estruturas de.
Programação Funcional
Programação Lógica com Prolog
George Darmiton da Cunha Cavalcanti
Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010.
Funções como Valor ©André Santos e Marcelo d’Amorim.
INE Fundamentos de Matemática Discreta para a Computação
Semântica de Linguagens de Programação
Matemática Discreta I BCC101
CLASSIFICAÇÃO DE DADOS
Linguagem de 1ª ordem da teoria de conjuntos
1 IO em LF1 Paradigmas de Linguagens de Programação 2007 Diego Martins, Laís Xavier, Paulo Martinelli e Turah Xavier.
Paulo Borba e Augusto Sampaio Departamento de Informática Universidade Federal de Pernambuco Especificação Usando Conjuntos.
©André Santos, Programação Funcional Funções como valores André Santos.
BCC101 – Matemática Discreta
tópicostópicos itens 01. Terminologia 02. Operações básicas 03. Representação de linguagens 04. Formalização de gramáticas 05. Processo de derivação 06.
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Vinicius Ponte Machado
Universidade Estadual de Santa Cruz Conceitos de Linguagens de Programação Aluno: Pedro Arthur M. Nascimento Ilhéus-Ba, 05 de Novembro de 2012.
Álgebra de Boole Circuitos Digitais
1.3 - Propriedades dos Limites
Implementar Listas em Linguagem Funcional II Projeto I - PLP Prof. Augusto Sampaio Equipe :Ana Paula Cavalcanti (apcc2) Clélio Feitosa (cfs) Zildomar C.
Estrutura de Dados Prof. André Cypriano M. Costa
Compreensão de Listas Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (
Lazy Evaluation (Avaliação Preguiçosa) Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (
Funções Recursivas Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
Exercícios da lista 2. Prova –slide 42 – aula 2 – demonstração da existência de uma fç utilidade Nós concluímos então que existe no máximo um escalar,
Definindo Funções Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (
PROGRAMAÇÃO FUNCIONAL COM SCALA Leonardo Lucena IFRN
Linguagem Funcional 2.
Transcrição da apresentação:

Funções de Alta Ordem Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton ( These slides may be used or modified for any educational purpose on a non-profit-making basis, provided that I am acknowledged as the original author.

 Uma função é de alta-ordem se ela pega uma função como argumento ou devolve uma função como resultado. 1 def twice[T](f: T => T, x: T): T = f(f(x)) twice é de alta-ordem porque ela pega uma função como seu primeiro arqumento.

 Idiomas comuns de programação podem ser codificados como funções dentro da própria linguagem.  Linguagens Especificas de Domínio podem ser definidas como uma coleção de funções de alta-ordem.  Propriedades Algébricas de funções de alta-ordem podem ser usadas para raciocinar sobre programas. 2

 A função de alta-ordem map aplica uma função a cada elemento de uma lista.  Exemplo 3 class List[T] { def map[R](f:T=>R): List[R] = … } > List(1,3,5,7).map(_+1) List(2,4,6,8)

 A função map pode ser definida de forma bem simples usando compreensão for:  Ou alternativamente, para efeito de prova, usando recursão: 4 def map[R](f:T=>R): List[R] = for(x  xs) yield f(x) def map[R](f:T=>R): List[R] = xs match { case List() => List() case y::ys => f(y)::ys.map(f) }

 A função de alta-ordem filtro seleciona cada elemento de uma lista que satisfaz um predicado.  Exemplo: 5 class List[T] { def filter(T => Boolean): List[T] = … } > 1 to 10 filter par List(2,4,6,8,10)

 Filter pode ser definida usando compreensão de listas:  Ou Alternativamente using recursion: 6 def filter(p: T => Boolean) = for(x  xs; if p(x)) yield x def filter(p: T => Boolean) = xs match { case List() => List() case y::ys if p(x) => y:: ys.filter(p) case y::ys => ys.filter(p) }

 Várias funções envolvendo listas podem ser definidas usando o seguinte padrão de recursão: 7 def f[T](xs: List[T]) = xs match { case List() => v case y::ys => y  f(ys) } f mapeia a lista vazia para um valor v e qualquer lista não vazia para alguma função  aplicada para a sua cabeça e a função f aplicada ao restante.

8 def soma(xs: List) = xs match { case List() => 0 case x::xs => x + soma(ys) } def and(xs: List) = xs match { case List() => true case x::xs => x && and(ys) } def produto(xs: List) = xs match { case List() => 1 case x::xs => x * produto(ys) } v = 0  = + v = 1  = * v = true  = &&

 A função de alta-ordem foldRight encapsula o padrão de recursão, com o valor v e a função  como argumentos.  Exemplos: 9 def sum(xs:List[Int]) = xs.foldRight(0)(+) def produto(xs:List[Int]) = xs.foldRight(1)(*) def or(xs:List[Boolean]) = xs.foldRight(false)(||) def and(xs:List[Boolean]) = xs.foldRight(true)(&&)

 A função foldRight pode ser definida usando recursão: Entretando, é melhor pensar em foldRight de forma não recursiva, através da substituição simultânea de cada (::) em uma lista pofr uma função dada e Nil por um valor dado. 10 def foldRight[R](v: R, f: (T, R) => R): R = xs match { case List() => v case y::ys => f(y, ys.foldRight(v,f)) }

11 soma (List(1,2,3)) List(1,2,3).foldRight(0)(+) = (1::(2::(3::Nil))).foldRight(0)(+) = 1+(2+(3+0)) = 6 = Substituindo cada (::) por (+) e Nil por 0.

12 Produto(List(1,2,3)) List(1,2,3).foldRight(1)(*) = (1::(2::(3::Nil))).foldRight(1)(*) = 1*(2*(3*1)) = 6 = Substituindo cada (::) por (*) e Nil por 1.

 Apesar de foldRight encapsular um padrão simples de recursão, ela pode ser usada para definir muito mais funções do que inicialmente esperado.  Lembre a função length (tamanho): 13 def length(xs: List[T]): Int = xs match { case List() => 0 case _::ys => 1 + length(xs) }

14 length(List(1,2,3)) length(1::(2::(3::Nil))) = 1+(1+(1+0)) = 3 = Assim, temos: def length = foldRight(0)((_, n) => 1 + n) Substitua cada (::) por ((_,n) =>1+n) e List() por 0.

15 def reverse[T](xs: List[T]) = xs match { case Nil => Nil case y::ys => reverse(ys):::List(y) } reverse(List(1,2,3)) reverse(1::(2::(3::Nil))) = ((Nil:::List(3)):::List(2)):::List(1) = List(3,2,1) = For example: Substitua cada (::) por ((x::xs) => xs:::List(x)) e Nil por Nil.

 Assim, temos:  Finalmente, note que a função de agrupamento (:::) tem uma definição compacta usando foldRight: 16 def reverse[T](xs: List[T]) = xs.foldRight(Nil)((x::xs)=>xs:::List(x)) def :::(xs: List, ys: List) = xs.foldRight(ys)(::) Substitua cada (::) por (::) e Nil por ys.

 Algumas funções recursivas de listas, como soma, são mais simples para definir usando foldRight.  Propriedades de funções definidas usando foldRight podem ser provadas usando propriedades algébricas, como fusão e a regra da banana split  Otimizações avançadas de programas podem ser mais simples se foldRight for usada em lugar de recursão explícita 17

 A função all decide se cada elemento de uma lista satisfaz um dado predicado.  Por exemplo: 18 def all[T](p:T=>Boolean,xs:List[T]):Boolean= (for(x<-xs, if p(x)) yield x).and > all(par, List(2,4,6,8,10)) true

 A função any decide se ao menos um dos elementos de uma lista satisfaz um predicado.  Por Exemplo 19 def any[T](p:T=>Boolean,xs:List[T]):Boolean= (for(x<-xs, if p(x)) yield x).or > any(éEspaço,"abc def“) true

 A função takeWhile seleciona elementos de uma lista enquanto um predicado for verdade para todos os elementos.  Por exemplo: 20 Class List[T] { … def takeWhile(p:T=>Boolean):List[T]=xs match { case y::ys if p(y) => y :: ys.takeWhile(p) case _ => Nil } > "abc def".takeWhile(éAlfa) "abc"

 A função dropWhile remove elementos enquanto um predicado for verdade para todos os elementos de uma lista.  Por exemplo 21 Class List[T] { … def dropWhile(p:T=>Boolean):List[T]=xs match { case y::ys if p(y) => ys.dropWhile(p) case ys => ys } > " abc".dropWhile(éEspaço) "abc"

1. Como são chamadas as funções de alta- ordem que devolvem funções? 2. Espresse a compreensão for(x<-xs, if p(x)) yield f(x) usando as funções map e filter. 3. Defina map(f) e filter(p) usando foldRight. 22