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

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

Programação Funcional Aulas 9, 10 & 11

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

Tipos de Dados Algébricos

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

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

Paradigmas de Programação

Linguagens de Programação Funcional

Aula prática 14. Expressão Lambda

Aula prática 5. Funções Recursivas

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

4.2. CLASSES Versão

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

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

Linguagens de Programação Aula 14

Programação Funcional

Expressões Condicionais

Pedro Vasconcelos DCC/FCUP. Programação Funcional 19 a Aula Raciocinar sobre programas

Programação Funcional. Aula 10. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto /74 ...

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

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

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

Programação Funcional 13 a Aula Tipos abstratos

Introdução a Linguagem C

Conceitos básicos de programação

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

Funções de Ordem Superior

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

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

Pedro Vasconcelos DCC/FCUP. Programação Funcional 17 a Aula Tipos abstratos

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

Programação Funcional. Capítulo 13. Mônadas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2012.

Expressões Condicionais

Programação Funcional em Haskell

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

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

UFJF - DCC - Estrutura de Dados e Laboratório de Programação II

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

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

PAA-DCC-UFAM. Árvores. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Linguagem Funcional Haskell

TÉCNICO DE INFORMÁTICA - SISTEMAS

Elementos Básicos. C# - Elementos básicos. Primeiro programa Tipos de dados Variáveis Constantes Expressões e operadores Controlo de fluxo Tabelas

Conceitos de Linguagens de Programação

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

Programação Funcional

Algoritmos: tipos de dados, variáveis e expressões

Expressão Condicional

Implementação de Linguagens

Simulação de Caixa Automático

Arrays. Professor: Ricardo Luis dos Santos IFSUL Campus Sapucaia do Sul

Conhecendo a Linguagem de Programação C

Funções de Ordem Superior

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

Exame de Admissão. Instituto Nacional de Pesquisas Espaciais 18 de setembro de 2018 A: GABARITO

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

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

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

Primeira Prova de Linguagens de Programação - DCC024B -

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

b) Recursividade 4 - Sejam a,b,c inteiros, supostamente comprimentos dos lados dum triângulo. Escreva uma função tri que devolva:

Programação Funcional Aulas 5 & 6

Aula de hoje. Expressões. Expressões. Expressões. Exemplos. Programa em Python. SCC Introdução à Programação para Engenharias

Unidade 5: Introdução à Programação com C/C++ Prof. Daniel Caetano

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

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

1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 E-books PCNA. Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 APRESENTANDO A LINGUAGEM C. Página 1

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

Programação de Computadores I. Professor Ilaim Costa Junior

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Aula de hoje. Tipos de Dados e Variáveis. Constantes literais. Dados. Variáveis. Tipagem dinâmica. SCC Introdução à Programação para Engenharias

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

Linguagens de Programação

Fundamentos de Programação

Introdução à Programação uma Abordagem Funcional

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

Linguagens de Programação

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

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Unidade 5: Introdução à Programação com Python Prof. Daniel Caetano

Programação Funcional

Interpretação e Compilação de Linguagens de Programação Semântica CALCI com Ambiente

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

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Unidade 5: Introdução à Programação com C/C++

Variáveis, Tipos de Dados e Operadores

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

Pedro Vasconcelos DCC/FCUP. Programação Funcional 14 a Aula Tipos abstratos de dados

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE DEPARTAMENTO DE INFORMÁTICA E MATEMÁTICA APLICADA. DIM0320 Algoritmos e Programação de Computadores

Lambda Cálculo e Programação Funcional. Programação Funcional Bacharelado em Sistemas de Informação Maio

Fundamentos de Algoritmos

Introdução à Linguagem C++

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação

Algoritmos II prof. Daniel Oliveira

Árvores Binárias de Procura. Travessias de árvores binárias

Revisão C++ - Parte 1

Transcrição:

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

Declarações de Tipos Em Haskell, um novo nome para um tipo existente pode ser definido usando uma declaração de tipo. type String = [Char] String é um sinônimo para o tipo [Char]. 2

Declarações de tipo são úteis para tornar outros tipos mais fáceis de ler. Por exemplo, com a declaração de tipo: type Pos = (Int,Int) type Board [Pos] Podemos definir: origin :: Pos origin = (0,0) left :: Pos Pos left (x,y) = (x-1,y) 3

Declarações de tipos podem ter parâmetros. Por exemplo: type Pair a = (a,a) Podemos definir: mult :: Pair Int Int mult (m,n) = m*n copy :: a Pair a copy x = (x,x) 4

Declarações de tipos não podem ser recursivas: type Tree = (Int,[Tree]) 5

Declarações de Dados Um tipo completamente novo pode ser definido pela especificação dos seus valores usando uma declaração de dados. data ValorVerdade = Falso Verdadeiro ValorVerdade é um novo tipo com dois novos valores Falso e Verdadeiro. 6

Os dois valores Falso e Verdadeiro são chamados construtores para o tipo ValorVerdade. Nomes de tipos e construtores devem começar com letra maiúscula. O símbolo é lido como ou. 7

Valores de novos tipos podem ser usados da mesma forma que os tipos primitivos. data Move = Left Right Up Down Podemos definir: directions :: [Move] directions = [Left,Up,Right] flip :: Move Move flip Left = Right flip Right = Left flip Up = Down flip Down = Up 8

Podemos definir a função move que recebe um movimento e uma posição e retorna outra posição de acordo com o movimento: move :: Move Pos Pos 9

Podemos definir a função move que recebe um movimento e uma posição e retorna outra posição de acordo com o movimento: move :: Move Pos Pos move Left (x,y) = (x-1,y) move Right (x,y) = (x+1,y) move Up (x,y) = (x,y+1) move Down (x,y) = (x,y-1) 10

Podemos definir a função moves que recebe uma lista de movimentos e uma posição e retorna a posição final de acordo com a lista de movimentos: moves :: [Move] Pos Pos 11

Podemos definir a função moves que recebe uma lista de movimentos e uma posição e retorna a posição final de acordo com a lista de movimentos: moves :: [Move] Pos Pos moves [] p = p moves (m:ms) p = moves ms (move m p) 12

Os construtores em uma declaração de dados pode ter parâmetros. data Shape = Circle Float Rect Float Float Podemos definir: square :: Float Shape square n = Rect n n area :: Shape Float area (Circle r) = pi * r^2 area (Rect x y) = x * y 13

Shape possui valores da forma Circle r em que r é um float, e Rect x y em que x e y são floats. Circle e Rect podem ser vistos como funcões que constroem valores do tipo Shape: Circle :: Float Shape Rect :: Float Float Shape 14

A própria declaração de dados pode ter parâmetros. data Maybe a = Nothing Just a Podemos definir: safediv :: Int Int Maybe Int safediv _ 0 = Nothing safediv m n = Just (m `div` n) safehead :: [a] Maybe a safehead [] = Nothing safehead xs = Just (head xs) 15

Tipos Recursivos Em Haskell, novos tipos podem ser declarados em termos deles mesmos. data Nat = Zero Succ Nat Nat é um novo tipo com construtores Zero :: Nat e Succ :: Nat Nat. 16

Um valor do tipo Nat ou é Zero, ou é da forma Succ n em que n :: Nat. Ou seja,, Nat possui a seguinte sequencia infinita de valores: Zero Succ Zero Succ (Succ Zero) 17

Podemos pensar nos valores do tipo Nat como números naturais, em que Zero representa 0, e Succ representa a função sucessor 1+. Por exemplo, Succ (Succ (Succ Zero)) representa o número natural 1 + (1 + (1 + 0)) = 3 18

Usando recursão, é fácil definir funções que convertem entre valores do tipo Nat e Int: nat2int :: Nat Int nat2int Zero = 0 nat2int (Succ n) = 1 + nat2int n int2nat :: Int Nat int2nat 0 = Zero int2nat n = Succ (int2nat (n-1)) 19

Podemos definir nossa própria versão de listas: Data List a = Nil Cons a (List a) E definir nossa própria versão do length: len :: List a Int 20

Podemos definir nossa própria versão de listas: Data List a = Nil Cons a (List a) E definir nossa própria versão do length: len :: List a Int len Nil = 0 len Cons x xs = 1 + length xs 21

Expressões Aritméticas Considere uma simples forma de expressões construídas a partir de inteiros usando adição e multiplicação. + 1 2 3 22

Usando tipos recursivos, podemos declarar expressões aritméticas como: data Expr = Val Int Add Expr Expr Mul Expr Expr A expressões no slide anterior é representada como: Add (Val 1) (Mul (Val 2) (Val 3)) 23

Usando recursão, é fácil definir funções que processam expressões: size :: Expr Int size (Val n) = 1 size (Add x y) = size x + size y size (Mul x y) = size x + size y 24

Podemos definir uma função que efetua a expressão aritmética: eval :: Expr Int 25

Podemos definir uma função que efetua a expressão aritmética: eval :: Expr Int eval (Val n) = n eval (Add x y) = eval x + eval y eval (Mul x y) = eval x * eval y 26

Árvores Binárias São árvores em que cada nó possui dois filhos. 5 3 7 1 4 6 9 27

Usando tipos recursivos, podemos representar ávores binárias por: 28

Usando tipos recursivos, podemos representar ávores binárias por: data Tree a = Leaf a Node (Tree a) a (Tree a) A árvore do slide anterior é representada da seguinte forma: t :: Tree Int t = Node (Node (Leaf 1) 3 (Leaf 4)) 5 (Node (Leaf 6) 7 (Leaf 9)) 29

Podemos definir uma função que decide se um dado valor ocorre na árvore binária: occurs :: Eq a a Tree a Bool 30

Podemos definir uma função que decide se um dado valor ocorre na árvore binária: occurs :: Eq a a Tree a Bool occurs x (Leaf y) = x == y occurs x (Node left y right) = x == y occurs x left occurs x right 31

Podemos definir a função flatten que retorna a lista de todos os valores na árvore: flatten :: Tree a [a] 32

Podemos definir a função flatten que retorna a lista de todos os valores na árvore: flatten :: Tree a [a] flatten (Leaf x) = [x] flatten (Node left x right) = flatten left ++ [x] ++ flatten right 33

Uma árvore binária de busca é um árvore em que para todo nó, a subárvore esquerda tem todos os nós com valor menor e a subárvore direita tem todos os nós com valor maior 5 3 7 1 4 6 9 34

Podemos definir a função occursbst que para achar um valor, escolhe a subárvore adequada occursbst :: Ord a a Tree a Bool 35

Podemos definir a função occursbst que para achar um valor, escolhe a subárvore adequada occursbst :: Ord a a Tree a Bool occursbst x (Leaf y) = x == y occursbst x (Node left y right) x == y = True x < y = occursbst x left x > y = occursbst x right Essa nova definição é mais eficiente pois percorre apenas um caminho na árvore. 36