SlideShare uma empresa Scribd logo
1 de 30
Baixar para ler offline
Programação Funcional
em Haskell
2a Reunião — 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.
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
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.
ERRO
Em Haskell, estes erros são detectados classificando as
expressões com os tipos dos resultados.
>1 + False
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 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)
Tipos básicos :cont.
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.
Em geral: [T] é o tipo de listas cujos elementos são de tipo T.
[False,True,False] :: [Bool]
['a', 'b ', 'c', 'd'] :: [Char]
Tuplas
Uma tupla é uma sequência de tamanho fixo de elementos de
tipos possivelmente diferentes.
Em geral: (T1,T2,...,Tn) é o tipo de tuplas com n
componentes de tipos Ti para i de 1 a n.
>(42,'a') :: (Int,Char)
>(False,'b',True) :: (Bool,Char,Bool)
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)
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])
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 !!!
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.
Tipos funcionais: cont.
Os argumento e resultado duma função podem ser listas,
tuplas ou de quaisquer outros tipos.
somaNotaHaskell :: (Int,Int) -> Int
somaNotaHaskell (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.
NOTA: a esta forma de tratar múltiplos argumentos chama-se
currying
(em homenagem a Haskell B. Curry).
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) -> Int
soma' (x,y) = x+y
Porquê usar currying?
Funções curried são mais flexíveis do que funções usando
Tuplas 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]
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)
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 [1,2,3,4] -- Int
4
> length [False,True] -- Bool
2
> length [(0,'X'),(1,'O')] -- (Int,Char)
2
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 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.
“Num a => ...” é uma restrição de classe da variável a.
Indica que sum opera apenas sobre tipos a que sejam
numéricos.
sum :: Num a => [a] -> a
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
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
Classes pré-definidas: cont.
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 :: Fractional a => a -- tipo mais geral
3.0 :: Double
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.
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]
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):
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)
Agradecimentos
Ao Prof°- Ricardo Reis e a todos os participantes do projeto
haskell ufc.

Mais conteúdo relacionado

Mais procurados

Editor de Texto - Writer
Editor de Texto - WriterEditor de Texto - Writer
Editor de Texto - Writer
eliz71
 
Vamos aprender a usar o mouse
Vamos aprender a usar o mouseVamos aprender a usar o mouse
Vamos aprender a usar o mouse
emefetchegoyen
 
Apresentação do Teclado e Mouse
Apresentação do Teclado e MouseApresentação do Teclado e Mouse
Apresentação do Teclado e Mouse
Fraan Bittencourt
 
Seminário de Língua Inglesa- Roteiro do trabalho
Seminário de Língua Inglesa- Roteiro do trabalho  Seminário de Língua Inglesa- Roteiro do trabalho
Seminário de Língua Inglesa- Roteiro do trabalho
SHEILA MONTEIRO
 

Mais procurados (20)

Atalhos de teclado gerais
Atalhos de teclado geraisAtalhos de teclado gerais
Atalhos de teclado gerais
 
Funções das teclas do teclado
Funções das teclas do tecladoFunções das teclas do teclado
Funções das teclas do teclado
 
Estratégias de pesquisa simples na internet
Estratégias de pesquisa simples na internetEstratégias de pesquisa simples na internet
Estratégias de pesquisa simples na internet
 
Sub verb agreement
Sub verb agreementSub verb agreement
Sub verb agreement
 
Editor de Texto - Writer
Editor de Texto - WriterEditor de Texto - Writer
Editor de Texto - Writer
 
Partes do Teclado !
Partes do Teclado !Partes do Teclado !
Partes do Teclado !
 
Vamos aprender a usar o mouse
Vamos aprender a usar o mouseVamos aprender a usar o mouse
Vamos aprender a usar o mouse
 
Apresentação do Teclado e Mouse
Apresentação do Teclado e MouseApresentação do Teclado e Mouse
Apresentação do Teclado e Mouse
 
Design de Interfaces para Dispositivos Móveis
Design de Interfaces para Dispositivos MóveisDesign de Interfaces para Dispositivos Móveis
Design de Interfaces para Dispositivos Móveis
 
Modelagem de usuários
Modelagem de usuáriosModelagem de usuários
Modelagem de usuários
 
Sobre o teclado
Sobre o tecladoSobre o teclado
Sobre o teclado
 
Teclado
TecladoTeclado
Teclado
 
Teclado
TecladoTeclado
Teclado
 
Excel Basico
Excel BasicoExcel Basico
Excel Basico
 
Teclado e Mouse
Teclado e Mouse Teclado e Mouse
Teclado e Mouse
 
Curso Básico de Word 2013 - Parte II
Curso Básico de Word 2013 - Parte IICurso Básico de Word 2013 - Parte II
Curso Básico de Word 2013 - Parte II
 
HTML - Aula 01 - Estrutura básica e tags básicas no html
HTML - Aula 01 - Estrutura básica e tags básicas no htmlHTML - Aula 01 - Estrutura básica e tags básicas no html
HTML - Aula 01 - Estrutura básica e tags básicas no html
 
Algumas regras digitação
Algumas regras digitaçãoAlgumas regras digitação
Algumas regras digitação
 
Seminário de Língua Inglesa- Roteiro do trabalho
Seminário de Língua Inglesa- Roteiro do trabalho  Seminário de Língua Inglesa- Roteiro do trabalho
Seminário de Língua Inglesa- Roteiro do trabalho
 
Excel Básico
Excel BásicoExcel Básico
Excel Básico
 

Semelhante a Haskell aula2 tipos-e-classes

Programando em python tuplas e strings
Programando em python   tuplas e stringsProgramando em python   tuplas e strings
Programando em python tuplas e strings
samuelthiago
 
005 programando em python - tuplas e strings
005   programando em python - tuplas e strings005   programando em python - tuplas e strings
005 programando em python - tuplas e strings
Leandro Barbosa
 
7 paradigma funcional usando haskell
7 paradigma funcional usando haskell7 paradigma funcional usando haskell
7 paradigma funcional usando haskell
Péricles Miranda
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
Sérgio Souza Costa
 
Tipos de Dados em Python: Como Manipulamos Dados em Python?
Tipos de Dados em Python: Como Manipulamos Dados em Python?Tipos de Dados em Python: Como Manipulamos Dados em Python?
Tipos de Dados em Python: Como Manipulamos Dados em Python?
Marcelo Fabiano N. de Oliveira
 

Semelhante a Haskell aula2 tipos-e-classes (20)

Introdução a Python - Python Poli
Introdução a Python  - Python PoliIntrodução a Python  - Python Poli
Introdução a Python - Python Poli
 
Programando em python tuplas e strings
Programando em python   tuplas e stringsProgramando em python   tuplas e strings
Programando em python tuplas e strings
 
Slide_Python.pdf
Slide_Python.pdfSlide_Python.pdf
Slide_Python.pdf
 
Unidade7 1
Unidade7 1Unidade7 1
Unidade7 1
 
python.tipos
python.tipospython.tipos
python.tipos
 
005 programando em python - tuplas e strings
005   programando em python - tuplas e strings005   programando em python - tuplas e strings
005 programando em python - tuplas e strings
 
Introdução a linguagem Python 2.7
Introdução a linguagem Python 2.7Introdução a linguagem Python 2.7
Introdução a linguagem Python 2.7
 
Programando em python tipos basicos
Programando em python   tipos basicosProgramando em python   tipos basicos
Programando em python tipos basicos
 
07-lambda.pdf
07-lambda.pdf07-lambda.pdf
07-lambda.pdf
 
Ud3
Ud3Ud3
Ud3
 
Java Básico
Java BásicoJava Básico
Java Básico
 
Java2
Java2Java2
Java2
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: Introdução
 
Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)
 
Aula 11- Algoritmos e Programação.pptx
Aula 11- Algoritmos e Programação.pptxAula 11- Algoritmos e Programação.pptx
Aula 11- Algoritmos e Programação.pptx
 
Aula3PythonBasico.ppt
Aula3PythonBasico.pptAula3PythonBasico.ppt
Aula3PythonBasico.ppt
 
Aula3PythonBasico (1).ppt
Aula3PythonBasico (1).pptAula3PythonBasico (1).ppt
Aula3PythonBasico (1).ppt
 
7 paradigma funcional usando haskell
7 paradigma funcional usando haskell7 paradigma funcional usando haskell
7 paradigma funcional usando haskell
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
 
Tipos de Dados em Python: Como Manipulamos Dados em Python?
Tipos de Dados em Python: Como Manipulamos Dados em Python?Tipos de Dados em Python: Como Manipulamos Dados em Python?
Tipos de Dados em Python: Como Manipulamos Dados em Python?
 

Mais de CRISLANIO MACEDO

Mais de CRISLANIO MACEDO (20)

Record Deduplication and Record Linkage
Record Deduplication and  Record LinkageRecord Deduplication and  Record Linkage
Record Deduplication and Record Linkage
 
Pitch selo sebrae - Hackathon 2019
Pitch selo sebrae - Hackathon 2019Pitch selo sebrae - Hackathon 2019
Pitch selo sebrae - Hackathon 2019
 
Pitch Medbloc
Pitch MedblocPitch Medbloc
Pitch Medbloc
 
Search based gravitational algorithm
Search based gravitational algorithmSearch based gravitational algorithm
Search based gravitational algorithm
 
ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...
ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...
ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...
 
Integración de métodos ágiles a una empresa de nivel 5 cmmi dev- un caso de e...
Integración de métodos ágiles a una empresa de nivel 5 cmmi dev- un caso de e...Integración de métodos ágiles a una empresa de nivel 5 cmmi dev- un caso de e...
Integración de métodos ágiles a una empresa de nivel 5 cmmi dev- un caso de e...
 
JGROUPS- A Toolkit for Reliable Multicast Communication
JGROUPS- A Toolkit for Reliable Multicast CommunicationJGROUPS- A Toolkit for Reliable Multicast Communication
JGROUPS- A Toolkit for Reliable Multicast Communication
 
Inteligência artificial algumas técnicas aplicadas em jogos
Inteligência artificial  algumas técnicas aplicadas em jogosInteligência artificial  algumas técnicas aplicadas em jogos
Inteligência artificial algumas técnicas aplicadas em jogos
 
Artigo ia traps, invariants, and dead-ends
Artigo ia   traps, invariants, and dead-endsArtigo ia   traps, invariants, and dead-ends
Artigo ia traps, invariants, and dead-ends
 
Análise dos dados abertos do governo federal
Análise dos dados abertos do governo federalAnálise dos dados abertos do governo federal
Análise dos dados abertos do governo federal
 
ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...
ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...
ANÁLISE ESTATÍSTICA DA RELAÇÃO ENTRE EVASÃO E AS RESPOSTAS DO QUESTIONÁRIO PA...
 
Sistema de denúncia de desperdício de água - Etapa de Avaliação
Sistema de denúncia de desperdício de água - Etapa de AvaliaçãoSistema de denúncia de desperdício de água - Etapa de Avaliação
Sistema de denúncia de desperdício de água - Etapa de Avaliação
 
Sistema de denúncia de desperdício de água - Etapa de Síntese
Sistema de denúncia de desperdício de água - Etapa de SínteseSistema de denúncia de desperdício de água - Etapa de Síntese
Sistema de denúncia de desperdício de água - Etapa de Síntese
 
Resolução lista2
Resolução lista2Resolução lista2
Resolução lista2
 
Resoluçãohaskell2
Resoluçãohaskell2Resoluçãohaskell2
Resoluçãohaskell2
 
Haskell ufc quixadalista2
Haskell ufc quixadalista2Haskell ufc quixadalista2
Haskell ufc quixadalista2
 
Haskell ufc quixadalista1
Haskell ufc quixadalista1Haskell ufc quixadalista1
Haskell ufc quixadalista1
 
Haskell motivação
Haskell motivaçãoHaskell motivação
Haskell motivação
 
Haskell motivaçãoaula2
Haskell motivaçãoaula2Haskell motivaçãoaula2
Haskell motivaçãoaula2
 
Haskell aula7 libs_intro_arquivos
Haskell aula7 libs_intro_arquivosHaskell aula7 libs_intro_arquivos
Haskell aula7 libs_intro_arquivos
 

Último

Último (9)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Haskell aula2 tipos-e-classes

  • 1. Programação Funcional em Haskell 2a Reunião — Tipos e Classes
  • 2. 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.
  • 3. 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
  • 4. 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. ERRO Em Haskell, estes erros são detectados classificando as expressões com os tipos dos resultados. >1 + False
  • 5. 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.
  • 6. Tipos básicos Bool valores lógicos True, 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)
  • 7. Tipos básicos :cont. Float vírgula flutuante de precisão simples 3.14154, -1.23e10 Double vírgula flutuante de precisão dupla
  • 8. Listas Uma lista é uma sequência de tamanho variável de elementos dum 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]
  • 9. Tuplas Uma tupla é uma sequência de tamanho fixo de elementos de tipos possivelmente diferentes. Em geral: (T1,T2,...,Tn) é o tipo de tuplas com n componentes de tipos Ti para i de 1 a n. >(42,'a') :: (Int,Char) >(False,'b',True) :: (Bool,Char,Bool)
  • 10. 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)
  • 11. 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])
  • 12. 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 !!!
  • 13. 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.
  • 14. Tipos funcionais: cont. Os argumento e resultado duma função podem ser listas, tuplas ou de quaisquer outros tipos. somaNotaHaskell :: (Int,Int) -> Int somaNotaHaskell (x,y) = x+y contar :: Int -> [Int] contar n = [0..n]
  • 15. 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. NOTA: a esta forma de tratar múltiplos argumentos chama-se currying (em homenagem a Haskell B. Curry).
  • 16. 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) -> Int soma' (x,y) = x+y
  • 17. Porquê usar currying? Funções curried são mais flexíveis do que funções usando Tuplas 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]
  • 18. 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)
  • 19. 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 [1,2,3,4] -- Int 4 > length [False,True] -- Bool 2 > length [(0,'X'),(1,'O')] -- (Int,Char) 2
  • 20. 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 muito diferentes.
  • 21. 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
  • 22. Sobrecarga (overloading): cont. Nestes casos o tipo mais geral da função tem restrições de classe. “Num a => ...” é uma restrição de classe da variável a. Indica que sum opera apenas sobre tipos a que sejam numéricos. sum :: Num a => [a] -> a
  • 23. 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
  • 24. 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
  • 25. Classes pré-definidas: cont. 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 :: Fractional a => a -- tipo mais geral 3.0 :: Double
  • 26. 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.
  • 27. 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]
  • 28. 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):
  • 29. 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)
  • 30. Agradecimentos Ao Prof°- Ricardo Reis e a todos os participantes do projeto haskell ufc.