Paradigmas de Programação

Documentos relacionados
Pedro Vasconcelos DCC/FCUP. Programação Funcional 4 a Aula Listas

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Conceitos de Linguagens de Programação

Funções de Ordem Superior

Programação Funcional

Linguagem Funcional Haskell

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Linguagens de Programação. Programação Funcional. Carlos Bazilio

Programação Funcional

Linguagens de Programação Aula 14

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Programação Funcional Aulas 5 & 6

Lista de Exercício de Linguagens de Programação Prog. Funcional

Funções de Ordem Superior

Programação Funcional BCC222. Aulas 5,6. Mais sobre recursão

Paradigmas de Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Linguagens de Programação. Programação Funcional e Haskell Declarando Tipos Thiago Alves

Aula prática 14. Expressão Lambda

Aula prática 5. Funções Recursivas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Expressões Lambda. Programação Funcional. Capítulo 7. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Programação Funcional em Haskell

Expressões Condicionais

Tópicos Especiais em Informática Linguagem de Programação Haskell. Tiago Alves de Oliveira

Lista de Exercícios 4

Programação Funcional. Aula 6. Listas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Linguagens de Programação Programação Funcional (Haskell)

Pedro Vasconcelos DCC/FCUP. Programação Funcional 14 a Aula Um verificador de tautologia

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Estruturas de Dados Estruturas de Dados Fundamentais

Pedro Vasconcelos DCC/FCUP. Programação Funcional 8 a Aula Listas infinitas

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Expressões Condicionais

Exercícios: Recursão

Programação Funcional. Aula 3. Tipos e Classes. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -

Expressão Condicional

Intuição da sintaxe de L2 (35)

Processamento da Informação

Sumarizando Dados. Fabrício Olivetti de França. Universidade Federal do ABC

Estrutura de dados funcionais

Linguagens de Programação Aula 13

Pedro Vasconcelos DCC/FCUP. Programação Funcional 13 a Aula Definição de tipos

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

Linguagem Haskell. Riocemar S. de Santana

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Vetores em Haskell. Vetores e Matrizes. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU.

Linguagens de Programação. Programação Funcional Haskell. Carlos Bazilio

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Slide 01 16/03/2017. Estruturas de Dados. Prof. Cleziel Franzoni da /Cleziel.

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Programação Funcional

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Processamento da Informação

Programação Estruturada

Casamento de Padrão. Programação Funcional. Capítulo 6. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Introdução à linguagem de programação no Visual C#

Sets. Declaração: var y : Set[Int] = Set() O tipo do conjunto não é obrigatório, podendo usar a inferência: var x = Set(1,3,5,7)

Casamento de Padrão. Programação Funcional. Capítulo 5. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Programação Funcional 14 a Aula Classes de tipos revisitadas

ESTRUTURA DE DADOS CIÊNCIA E TECNOLOGIA DO RIO. Curso de Tecnologia em Sistemas para Internet

Linguagens de Programação

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO

Linguagem de programação Strings

Lista de Linguagens de Programação 16

Programação Funcional Capítulo 3 Tipos e Classes

Programação Funcional com a Linguagem Haskell

Universidade Federal do ABC Programação Estruturada Fabrício Olivetti França Lista de Exercícios 02

JAVA Referências, Strings e Arrays

Questão 1 Analise o trecho do código abaixo, escrito na linguagem C#:

ao paradigma imperativo

Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Estruturas de dados. Pedro Vasconcelos. 3 de Março de 2014

Linguagens de Programação

Paradigmas de Programação

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II Java Sexta aula

Array em Java. Figura 1 - Exemplo de um array de inteiros

Linguagens de Programação. Programação Funcional e Haskell Programação Interativa Thiago Alves

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Programação de Computadores

Lista 2 - PMR2300/3200

Sistema Operacional Unidade 11.2 Shell Script: estruturas condicionais. QI ESCOLAS E FACULDADES Curso Técnico em Informática

Introdução a Algoritmos Parte 08

Tuplas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Introdução à Programação. Uma Abordagem Funcional

Listas generalizadas. SCC-202 Algoritmos e Estruturas de Dados I

Pedro Vasconcelos DCC/FCUP. Programação Funcional 7 a Aula Funções de ordem superior

Processamento da Informação

Introdução ao Python. Prof. Fabrício Olivetti de França Universidade Federal do ABC

Linguagens de Programação

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

Transcrição:

Paradigmas de Programação Fabrício Olivetti de França 21 de Junho de 2018 1

Listas 2

Listas Uma das principais estruturas em linguagens funcionais. Representa uma coleção de valores de um determinado tipo. Todos os valores do mesmo tipo. 3

Listas Definição recursiva: ou é uma lista vazia ou um elemento do tipo genérico a concatenado com uma lista de a. data [] a = [] a : [a] (:) - concatenação de elemento com lista 4

Listas Seguindo a definição anterior, a lista [1, 2, 3, 4] é representada por: lista = 1 : 2 : 3 : 4 :[] 5

Listas É uma lista ligada!! lista = 1 : 2 : 3 : 4 :[] A complexidade das operações são as mesmas da estrutura de lista ligada! 6

Criando listas Existem diversos syntax sugar para criação de listas (ainda bem): [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 7

Criando listas Faixa de valores inclusivos: [1..10] == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 8

Criando listas Faixa de valores inclusivos com tamanho do passo: [0,2..10] == [0, 2, 4, 6, 8, 10] 9

Criando listas Lista infinita: [0,2..] == [0, 2, 4, 6, 8, 10,..] 10

Ao infinito e além Como o Haskell permite a criação de listas infinitas? Uma vez que a avaliação é preguiçosa, ao fazer: lista = [0,2..] ele cria apenas uma promessa de lista. 11

Ao infinito e além Efetivamente ele faz: lista = 0 : 2 : geraproximo sendo geraproximo uma função que gera o próximo elemento da lista. 12

Ao infinito e além Conforme for necessário, ele gera e avalia os elementos da lista sequencialmente. Então a lista infinita não existe em memória, apenas uma função que gera quantos elementos você precisar dela. 13

Funções básicas para manipular listas 14

Recuperar elementos O operador!! recupera o i-ésimo elemento da lista, com índice começando do 0: > lista = [0..10] > lista!! 2 2 Note que esse operador é custoso para listas ligadas! Não abuse dele! 15

Recuperar elementos A função head retorna o primeiro elemento da lista: > head [0..10] 0 16

Recuperar elementos A função tail retorna a lista sem o primeiro elemento (sua cauda): > tail [0..10] [1,2,3,4,5,6,7,8,9,10] 17

Exercício O que a seguinte expressão retornará? > head (tail [0..10]) 18

Recuperar elementos A função take retorna os n primeiros elementos da lista: > take 3 [0..10] [0,1,2] 19

Recuperar elementos E a função drop retorna a lista sem os n primeiros elementos: > drop 6 [0..10] [7,8,9,10] 20

Exercício (0.5 pto) Implemente o operador!! utilizando as funções anteriores. 21

Tamanho da lista O tamanho da lista é dado pela função length: > length [1..10] 10 22

Somatória e Produtória As funções sum e product retorna a somatória e produtória da lista: > sum [1..10] 55 > product [1..10] 3628800 23

Concatenando listas Para concatenar utilizamos o operador ++ para concatenar duas listas ou o : para adicionar um valor ao começo da lista: > [1..3] ++ [4..10] == [1..10] True > 1 : [2..10] == [1..10] True 24

Exercício Implemente a função fatorial utilizando o que aprendemos até então. 25

Pattern Matching com Listas 26

Pattern Matching Quais padrões podemos capturar em uma lista? 27

Pattern Matching Quais padrões podemos capturar em uma lista? Lista vazia: [] Lista com um elemento: (x : []) Lista com um elemento seguido de vários outros: (x : xs) E qualquer um deles pode ser substituído pelo não importa _. 28

Implementando a função nulo Para saber se uma lista está vazia utilizamos a função null: null :: [a] -> Bool null [] = True null _ = False 29

Implementando a função tamanho A função length pode ser implementada recursivamente da seguinte forma: length :: [a] -> Int length [] = 0 length (_:xs) = 1 + length xs 30

Exercício (0.5 pto) Implemente a função take. Se n <= 0 deve retornar uma lista vazia. 31

Strings Assim como em outras linguagens, uma String no Haskell é uma lista de Char: > "Ola Mundo" == ['O','l','a',' ','M','u','n','d','o'] 32

Compreensão de Listas 33

Definindo conjuntos na matemática Na matemática, quando falamos em conjuntos, definimos da seguinte forma: {x 2 x {1..5}} que é lido como x ao quadrado para todo x do conjunto de um a cinco. 34

Compreensão de Listas No Haskell podemos utilizar uma sintaxe parecida: > [x^2 x <- [1..5]] [1,4,9,16,25] que é lido como x ao quadrado tal que x vem da lista de valores de um a cinco. 35

Compreensão de Listas A expressão x <- [1..5] é chamada de expressão geradora, pois ela gera valores na sequência conforme eles forem requisitados. Outros exemplos: > [tolower c c <- "OLA MUNDO"] "ola mundo" > [(x, even x) x <- [1,2,3]] [(1, False), (2, True), (3, False)] 36

Compreensão de Listas Podemos combinar mais do que um gerador e, nesse caso, geramos uma lista da combinação dos valores deles: >[(x,y) x <- [1..4], y <- [4..5]] [(1,4),(1,5),(2,4),(2,5),(3,4),(3,5),(4,4),(4,5)] 37

Compreensão de Listas Se invertermos a ordem dos geradores, geramos a mesma lista mas em ordem diferente: > [(x,y) y <- [4..5], x <- [1..4]] [(1,4),(2,4),(3,4),(4,4),(1,5),(2,5),(3,5),(4,5)] Isso é equivalente a um laço for encadeado! 38

Compreensão de Listas Um gerador pode depender do valor gerado pelo gerador anterior: > [(i,j) i <- [1..5], j <- [i+1..5]] [(1,2),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5), (3,4),(3,5),(4,5)] 39

Compreensão de Listas Equivalente a: for (i=1; i<=5; i++) { for (j=i+1; j<=5; j++) { // faça algo } } 40

Exemplo: concat A função concat transforma uma lista de listas em uma lista única concatenada (conhecido em outras linguagens como flatten): > concat [[1,2],[3,4]] [1,2,3,4] 41

Exemplo: concat Ela pode ser definida utilizando compreensão de listas: concat xss = [x xs <- xss, x <- xs] 42

Exercício: length Defina a função length utilizando compreensão de listas! Dica, você pode somar uma lista de 1s do mesmo tamanho da sua lista. 43

Guards Nas compreensões de lista podemos utilizar o conceito de guardas para filtrar o conteúdo dos geradores condicionalmente: > [x x <- [1..10], even x] [2,4,6,8,10] 44

Divisores Vamos criar uma função chamada divisores que retorna uma lista de todos os divisores de n. Qual a assinatura? 45

Divisores Vamos criar uma função chamada divisores que retorna uma lista de todos os divisores de n. Quais os parâmetros? divisores :: Int -> [Int] 46

Divisores Vamos criar uma função chamada divisores que retorna uma lista de todos os divisores de n. Qual o gerador? divisores :: Int -> [Int] divisores n = [???] 47

Divisores Vamos criar uma função chamada divisores que retorna uma lista de todos os divisores de n. Qual o guard? divisores :: Int -> [Int] divisores n = [x x <- [1..n]] 48

Divisores Vamos criar uma função chamada divisores que retorna uma lista de todos os divisores de n. Qual o guard? divisores :: Int -> [Int] divisores n = [x x <- [1..n], n `mod` x == 0] 49

Divisores > divisores 15 [1,3,5,15] 50

Exercício Utilizando a função divisores defina a função primo que retorna True se um certo número é primo. 51

Primo Note que para determinar se um número não é primo a função primo não vai gerar todos os divisores de n. Por ser uma avaliação preguiçosa ela irá parar na primeira comparação que resultar em False: primo 10 => 1 : _ == 1 : 10 : [] (1 == 1) => 1 : 2 : _ == 1 : 10 : [] (2 /= 10) False 52

Primos Com a função primo podemos gerar a lista dos primos dentro de uma faixa de valores: primos :: Int -> [Int] primos n = [x x <- [1..n], primo x] 53

A função zip A função zip junta duas listas retornando uma lista de pares: > zip [1,2,3] [4,5,6] [(1,4),(2,5),(3,6)] > zip [1,2,3] ['a', 'b', 'c'] [(1,'a'),(2,'b'),(3,'c')] > zip [1,2,3] ['a', 'b', 'c', 'd'] [(1,'a'),(2,'b'),(3,'c')] 54

Função pairs Vamos criar uma função que, dada uma lista, retorna os pares dos elementos adjacentes dessa lista, ou seja: > pairs [1,2,3] [(1,2), (2,3)] 55

Função pairs A assinatura será: pairs :: [a] -> [(a,a)] 56

Função pairs E a definição será: pairs :: [a] -> [(a,a)] pairs xs = zip xs (tail xs) 57

Exercício (0.5 pto) Utilizando a função pairs defina a função sorted que retorna verdadeiro se uma lista está ordenada. Utilize também a função and que retorna verdadeiro se todos os elementos da lista forem verdadeiros. sorted :: Ord a => [a] -> Bool 58