haskell aula2 tipos-e-classes

30
Programação Funcional em Haskell 2a Reunião — Tipos e Classes

Upload: crislanio-macedo

Post on 21-Aug-2015

52 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Haskell aula2 tipos-e-classes

Programação Funcional em Haskell2a Reunião — Tipos e Classes

Page 2: Haskell aula2 tipos-e-classes

Conteúdo e objetivos

Introdução à programação funcional usando Haskell Objetivos de aprendizagem

Apresentação de Tipos funcionais e Classes;

Exemplos e erros de Tipos ;

Funções com vários argumentos, Tuplas vs currying;

Funções polimorfas

Quando usar Anotações de tipos Seção de Desafios.

Page 3: Haskell aula2 tipos-e-classes

Tipos

Um tipo é um nome para uma coleção de valores relacionados.

Por exemplo, o tipo Bool contém dois valores lógicos:True False

Page 4: Haskell aula2 tipos-e-classes

Erros de tipos

Algumas operações só fazem sentido com valores dedeterminados tipos.

Por exemplo: não faz sentido somar números e valores lógicos.

ERROEm Haskell, estes erros são detectados classificando asexpressões com os tipos dos resultados.

>1 + False

Page 5: Haskell aula2 tipos-e-classes

Tipos em Haskell

Escrevemos e :: Tpara 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 einfere tipos omitidos.

Os programas com erros de tipos são rejeitados antes daexecução.

Page 6: Haskell aula2 tipos-e-classes

Tipos básicos

Bool valores lógicosTrue, False

Char caracteres simples'A', 'B', '?', '\n'

String sequências de caracteres"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)

Page 7: Haskell aula2 tipos-e-classes

Tipos básicos :cont.

Float vírgula flutuante de precisão simples3.14154, -1.23e10

Double vírgula flutuante de precisão dupla

Page 8: Haskell aula2 tipos-e-classes

Listas

Uma lista é uma sequência de tamanho variável de elementosdum mesmo tipo.

Em geral: [T] é o tipo de listas cujos elementos são de tipo T.

[False,True,False] :: [Bool]

['a', 'b ', 'c', 'd'] :: [Char]

Page 9: Haskell aula2 tipos-e-classes

Tuplas

Uma tupla é uma sequência de tamanho fixo de elementos detipos possivelmente diferentes.

Em geral: (T1,T2,...,Tn) é o tipo de tuplas com ncomponentes de tipos Ti para i de 1 a n.

>(42,'a') :: (Int,Char)

>(False,'b',True) :: (Bool,Char,Bool)

Page 10: Haskell aula2 tipos-e-classes

Observações

Listas de tamanhos diferentes podem ter o mesmo tipo.

Tuplas de tamanhos diferentes têm tipos diferentes.

['a'] :: [Char]

['b','a','b'] :: [Char]

('a','b') :: (Char,Char)

('b','a','b') :: (Char,Char,Char)

Page 11: Haskell aula2 tipos-e-classes

Observações: cont.

Os elementos de listas e tuplas podem ser quaisquer valores,inclusive outras listas e tuplas.

[['a'], ['b','c']] :: [[Char]]

(1,('a',2)) :: (Int,(Char,Int))

(1, ['a','b']) :: (Int,[Char])

Page 12: Haskell aula2 tipos-e-classes

Observações: cont.

A lista vazia [] admite qualquer tipo de lista [T]

A tupla vazia () é o único valor do tipo unitário ()

Não existem tuplas com apenas um elemento !!!

Page 13: Haskell aula2 tipos-e-classes

Tipos funcionais.

Uma função faz corresponder valores de um tipo em valores de outro um tipo.

Em geral: T1->T2 é o tipo das funções que fazem corresponder

valores do tipo T1 em valores do tipo T2.

Page 14: Haskell aula2 tipos-e-classes

Tipos funcionais: cont.

Os argumento e resultado duma função podem ser listas,tuplas ou de quaisquer outros tipos.

somaNotaHaskell :: (Int,Int) -> IntsomaNotaHaskell (x,y) = x+y

contar :: Int -> [Int]contar n = [0..n]

Page 15: Haskell aula2 tipos-e-classes

Funções de vários argumentos

Uma função de vários argumentos toma um argumento decada vez.

soma :: Int -> (Int -> Int)soma x y = x+yincr :: Int -> Intincr = soma 1

Ou seja: soma 1 é a função que a cada y associa 1 + y.

NOTA: a esta forma de tratar múltiplos argumentos chama-se currying(em homenagem a Haskell B. Curry).

Page 16: Haskell aula2 tipos-e-classes

Tuplas 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) -> Intsoma' (x,y) = x+y

Page 17: Haskell aula2 tipos-e-classes

Porquê usar currying?

Funções curried são mais flexíveis do que funções usandoTuplas porque podemos aplicá-las parcialmente.

Exemplos-- incrementar

soma 1 :: Int -> Int-- primeiros 5 elms.

take 5 :: [Char] -> [Char]-- retirar 5 elms.

drop 5 :: [Char] -> [Char]

Page 18: Haskell aula2 tipos-e-classes

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 É O MESMO QUE

Int -> (Int -> (Int -> Int))

f x y z É O MESMO QUE (((f x) y) z)

Page 19: Haskell aula2 tipos-e-classes

Funções Polimorfas

Certas funções operam com valores de qualquer tipo; taisfunções admitem tipos com variáveis.

Uma função diz-se polimorfa (“de muitas formas”) se admiteum tipo com variáveis.

Exemplo:

> length [1,2,3,4] -- Int4> length [False,True] -- Bool2> length [(0,'X'),(1,'O')] -- (Int,Char)2

Page 20: Haskell aula2 tipos-e-classes

Funções Polimorfas: cont.

Muitas funções do prelúdio-padrão são polimorficas: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 muitodiferentes.

Page 21: Haskell aula2 tipos-e-classes

Sobrecarga (overloading)

Certas funções operam sobre vários tipos mas não sobrequaisquer tipos.

> sum [1,2,3]6> sum [1.5, 0.5, 2.5]4.5> sum ['a', 'b', 'c']ERRO> sum [True, False]ERRO

Page 22: Haskell aula2 tipos-e-classes

Sobrecarga (overloading): cont.

Nestes casos o tipo mais geral da função tem restrições declasse.

“Num a => ...” é uma restrição de classe da variável a.

Indica que sum opera apenas sobre tipos a que sejamnuméricos.

sum :: Num a => [a] -> a

Page 23: Haskell aula2 tipos-e-classes

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

Page 24: Haskell aula2 tipos-e-classes

Classes pré-definidas: cont.

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

Page 25: Haskell aula2 tipos-e-classes

Classes pré-definidas: cont.

Em Haskell, também as constantes numéricas podem serusadas com vários tipos:

1 :: Int1 :: Float1 :: Num a => a -- tipo mais geral

3.0 :: Float3.0 :: Fractional a => a -- tipo mais geral3.0 :: Double

Page 26: Haskell aula2 tipos-e-classes

Quando usar anotações de tipos

Podemos escrever definições e deixar o interpretadorinferir 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.

Page 27: Haskell aula2 tipos-e-classes

Seção desafio: Tipos e Classes

Responda as questões a seguir:

Indique tipos admissíveis para os seguintes valores.

(a) [’a’, ’b’, ’c’](b) (’a’, ’b’, ’c’)(c) [(False; ’0’), (True; ’1’)](d) ([False;True], [’0’; ’1’])(e) [tail , init , reverse](f) [id , not]

Page 28: Haskell aula2 tipos-e-classes

Seção desafio:

Responda as questões a seguir:

1) Indique um tipo admissível para [[1],[2,3],[4,5,6]]: [['a'],['c','d'],['f','g','h']]:

head [[1],[2,3],[4,5,6]]: map (>0):

Page 29: Haskell aula2 tipos-e-classes

Seção desafio:

Indique o tipo mais geral para as seguintes definições; tenha o cuidado de incluir restrições de classes no caso de operações com sobrecarga. (VER PAG SOBRE SOBRECARGA)(a) segundo xs = head (tail xs)(b) trocar (x, y) = (y, x)(c) par x y = (x, y)(d) dobro x = 2*x(e) metade x = x/2(f) minuscula x = x >= ’a’ && x <= ’z’(g) intervalo x a b = x >= a && x <= b(h) palindrome xs = reverse xs == xs(i) haskell f x = f (f x)

Page 30: Haskell aula2 tipos-e-classes

Agradecimentos

Ao Prof°- Ricardo Reis e a todos os participantes do projeto haskell ufc.