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

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

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

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

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

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

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

Introdução à Programação Aula 3 Primeiros programas

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

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

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

Conceitos de Linguagens de Programação

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

Programação Funcional Aulas 5 & 6

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

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

Programação Funcional

Expressões Condicionais

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

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

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

Aula 3 Conceitos de memória, variáveis e constantes Cleverton Hentz

Linguagens de Programação Aula 13

Linguagem Haskell. Riocemar S. de Santana

Paradigmas de Linguagens

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

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

Expressão Condicional

Programação Funcional. Aula 4. Definindo Funções. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Funções de Ordem Superior

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

Algoritmos e Estruturas de Dados I

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

Ambientação com a Sintaxe de Java: parte 1

JSP Prof. Daniela Pires. VARIAVEIS... 2 Tipos de Dados... 2 String Float Integer Boolean... 3

Introdução à Computação MAC0110

Algoritmos: Conceitos Fundamentais. Slides de autoria de Rosely Sanches e Simone Senger de Souza

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 3 de setembro de 2010

Algoritmos e Estrutura de Dados Aula 08 Pilhas

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

Sistemas de Numeração

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

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Algoritmos I Aula 13 Linguagem de Programação Java

Disciplina de Algoritmos e Programação

Disciplina de Algoritmos e Programação

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Introdução a Programação de Jogos

Pedro Vasconcelos DCC/FCUP. Programação Funcional 16 a Aula Árvores equilibradas

Tema da aula Introdução ao paradigma de programação: Orientado a Objetos

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

Aula 3. Objetivos Sequências de escapes ; Um aplicativo que adiciona inteiro; Aritmética.

Programação com Acesso a BD. Programação com OO Acesso em Java

Introdução à Programação em Java Constantes, expressões e variáveis

Linguagens de Programação Conceitos e Técnicas. Amarrações

Tipos, Literais, Operadores

Introdução à Linguagem C++

Programação I Aula 10 Processamento de listas

Variáveis Tipos de Dados. APROG (Civil) Aula 2

Linguagem C: Introdução

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

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

1) Operadores de auto incremento ++ e auto decremento --

Professor: Domingos Equipe Haskell: Lucas Montesuma, Francisco Leonardo CONCEITOS DA LINGUAGEM DE PROGRAMAÇÃO CÁLCULADORA EM HASKELL

Universidade Federal de Uberlândia Faculdade de Computação. Representação e aritmética binária

Programação Funcional

Programação Básica. Estrutura de um algoritmo

Fundamentos de Programação. Linguagem C++ aula II - Variáveis e constantes. Prof.: Bruno Gomes

COMPORTAMENTOS - Observações

Lição 4 Fundamentos da programação

Introdução à Programação

C Operadores e Expressões

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

Iteração e Pontos Fixos

Programação de Computadores:

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Transcrição:

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

Tipos Um tipo é um nome para uma coleção de valores relacionados. Por exemplo, o tipo Bool True contém dois valores lógicos: False

Erros de tipos Algumas operações só fazem sentido com valores de determinados tipos. Por exemplo: não faz sentido somar números e valores lógicos. > 1 + False ERRO Em Haskell, estes erros são detetados classificando as expressões com os tipos dos resultados.

Tipos em Haskell Escrevemos e :: T para indicar que a expressão e admite o tipo T. Se e :: T, então o resultado de e será um valor de tipo T. O interpretador verifica tipos indicados pelo programador e infere tipos omitidos. Os programas com erros de tipos são rejeitados antes da execução.

Tipos básicos Bool valores lógicos True, False Char carateres simples 'A', 'B', '?', '\n' String sequências de carateres "Abba", "UB40" Int inteiros de precisão fixa (32 ou 64-bits) 142, -1233456 Integer inteiros de precisão arbitrária (apenas limitados pela memória do computador) Float vírgula flutuante de precisão simples 3.14154, -1.23e10 Double vírgula flutuante de precisão dupla

Listas Uma lista é uma sequência de tamanho variável de elementos dum mesmo tipo. [False,True,False] :: [Bool] ['a', 'b', 'c', 'd'] :: [Char] Em geral: [T ] é o tipo de listas cujos elementos são de tipo T.

Tuplos Um tuplo é uma sequência de tamanho fixo de elementos de tipos possivelmente diferentes. (42,'a') :: (Int,Char) (False,'b',True) :: (Bool,Char,Bool) Em geral: (T 1,T 2,...,T n ) é o tipo de tuplos com n componentes de tipos T i para i de 1 a n.

Observações Listas de tamanhos diferentes podem ter o mesmo tipo. Tuplos de tamanhos diferentes têm tipos diferentes. ['a'] :: [Char] ['b','a','b'] :: [Char] ('a','b') :: (Char,Char) ('b','a','b') :: (Char,Char,Char)

Observações (cont.) Os elementos de listas e tuplos podem ser quaisquer valores, inclusivé outras listas e tuplos. [['a'], ['b','c']] :: [[Char]] (1,('a',2)) :: (Int,(Char,Int)) (1, ['a','b']) :: (Int,[Char])

Observações (cont.) A lista vazia [] admite qualquer tipo de lista [T ] O tuplo vazio () é o único valor do tipo unitário () Não existem tuplos com apenas um elemento

Tipos funcionais Uma função faz corresponder valores de um tipo em valores de outro um tipo. not :: Bool -> Bool isdigit :: Char -> Bool Em geral: T 1 ->T 2 é o tipo das funções que fazem corresponder valores do tipo T 1 em valores do tipo T 2.

Tipos funcionais (cont.) Os argumento e resultado duma função podem ser listas, tuplos ou de quaisquer outros tipos. soma :: (Int,Int) -> Int soma (x,y) = x+y contar :: Int -> [Int] contar n = [0..n]

Funções de vários argumentos Uma função de vários argumentos toma um argumento de cada vez. soma :: Int -> (Int -> Int) soma x y = x+y incr :: Int -> Int incr = soma 1 Ou seja: soma 1 é a função que a cada y associa 1 + y. NB: a esta forma de tratar múltiplos argumentos chama-se currying (em homenagem a Haskell B. Curry).

Tuplos vs. currying Função de dois argumentos (curried) soma :: Int -> (Int -> Int) soma x y = x+y Função de um argumento (par de inteiros) soma' :: (Int,Int) -> Int soma' (x,y) = x+y

Porquê usar currying? Funções curried são mais flexíveis do que funções usando tuplos porque podemos aplicá-las parcialmente. Exemplos soma 1 :: Int -> Int take 5 :: [Char] -> [Char] drop 5 :: [Char] -> [Char] -- incrementar -- primeiros 5 elms. -- retirar 5 elms. É preferível usar currying exceto quando queremos explicitamente construir tuplos.

Convenções sintáticas Duas convenções que reduzem a necessidade de parêntesis: a seta -> associa à direita; a aplicação associa à esquerda. Int -> Int -> Int -> Int = = Int -> (Int -> (Int -> Int)) f x y z = (((f x) y) z)

Funções polimorfas Certas funções operam com valores de qualquer tipo; tais funções admitem tipos com variáveis. Uma função diz-se polimorfa ( de muitas formas ) se admite um tipo com variáveis. Exemplo length :: [a] -> Int A função length calcula o comprimento duma lista de valores de qualquer tipo a.

Funções polimorfas (cont.) Ao aplicar funções polimorfas, as variáveis de tipos são automaticamente substituidas pelos tipos concretos: > length [1,2,3,4] -- Int 4 > length [False,True] -- Bool 2 > length [(0,'X'),(1,'O')] -- (Int,Char) 2 As variáveis de tipo devem começar por uma letra minúscula; é convencional usar a, b, c,...

Funções polimorfas (cont.) Muitas funções do prelúdio-padrão são poliformas: null :: [a] -> Bool head :: [a] -> a take :: Int -> [a] -> [a] fst :: (a,b) -> a zip :: [a] -> [b] -> [(a,b)] O polimorfismo permite usar estas funções em contextos muito diferentes.

Sobrecarga (overloading) Certas funções operam sobre vários tipos mas não sobre quaisquer tipos. > sum [1,2,3] 6 > sum [1.5, 0.5, 2.5] 4.5 > sum ['a', 'b', 'c'] ERRO > sum [True, False] ERRO

Sobrecarga (overloading) (cont.) Nestes casos o tipo mais geral da função tem restrições de classe. sum :: Num a => [a] -> a Num a =>... é uma restrição de classe da variável a. Indica que sum opera apenas sobre tipos a que sejam numéricos.

Algumas classes pré-definidas Num tipos numéricos (ex: Int, Integer, Float, Double) Integral tipos com divisão inteira (ex: Int, Integer) Fractional tipos com divisão fracionária (ex: Float, Double) Eq tipos com igualdade Ord tipos com ordem total Exemplos (+) :: Num a => a -> a -> a (/) :: Fractional a => a -> a -> a (==) :: Eq a => a -> a -> Bool (<) :: Ord a => a -> a -> Bool max :: Ord a => a -> a -> a

Hierarquia de classes Algumas classes respeitam uma hierarquica: Ord é uma subclasse de Eq Num é uma subclasse de Eq Fractional e Integral são subclasses de Num Assim, podemos usar: == e /= com tipos em Ord ou em Num +, - e * com tipos em Fractional ou em Integral

Constantes numéricas Em Haskell, também as constantes numéricas podem ser usadas com vários tipos: 1 :: Int 1 :: Float 1 :: Num a => a -- tipo mais geral 3.0 :: Float 3.0 :: Double 3.0 :: Fractional a => a -- tipo mais geral Assim, as expressões seguintes são correctamente tipadas: 1/3 :: Float (1 + 1.5 + 2) :: Float

Misturar tipos numéricos Uma função para calcular a média duma lista de números. media :: [Float] -> Float media xs = sum xs / length xs

Misturar tipos numéricos Uma função para calcular a média duma lista de números. media :: [Float] -> Float media xs = sum xs / length xs Erro de tipos! Couldn't match expected type `Float' with actual type `Int' In the return type of a call of `length' In the second argument of `(/)', namely `length xs' In the expression: sum xs / length xs

Misturar tipos numéricos (cont.) Problema (/) :: Fractional a => a -> a -> a -- divisão fracionária length xs :: Int -- não é fracionário Solução: usar uma conversão explícita media :: [Float] -> Float media xs = sum xs / fromintegral (length xs) fromintegral converte qualquer tipo inteiro para qualquer outro tipo numérico.

Quando usar anotações de tipos Podemos escrever definições e deixar o interpretador inferir os tipos. É melhor prática anotar o tipo de cada definição: serve de documentação; ajuda a escrever as definições; permite mensagens de erro de tipos mais compreensíveis. Pode ser mais fácil começar com um tipo concreto e depois generalizar. O interpretador dá um erro de tipos se a generalização for errada. O tipo mais geral de funções com operações númericas, igualdade ou comparações, necessita sempre de restrições de classes.