Buscar

Linguagens de Programação - Introdução a Linguagem Funcional Haskell

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Introduc¸a˜o a Linguagem Funcional Haskell
Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Rodrigo Bonifa´cio
22 de marc¸o de 2012
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Inspirac¸a˜o para esses slides
Programming in Haskell (G. Hutton)
The Haskell school of expression (P. Hudak)
Introduction to Haskell Course (R Laemmel)
Learn You Haskell
. . . (http://learnyouahaskell.com/introduction)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
O que e´ uma linguagem funcional
Programac¸a˜o funcional e´ um estilo de programac¸a˜o em que o
me´todo ba´sico de computac¸a˜o e´ a aplicac¸a˜o de func¸o˜es a
argumentos;
Uma linguagem de programac¸a˜o funcional suporta e encoraja
a aplicac¸a˜o do estilo funcional, dirigindo a decomposic¸a˜o dos
problemas em termos de func¸o˜es e composic¸a˜o de func¸o˜es.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
O que e´ uma linguagem funcional
Programac¸a˜o funcional e´ um estilo de programac¸a˜o em que o
me´todo ba´sico de computac¸a˜o e´ a aplicac¸a˜o de func¸o˜es a
argumentos;
Uma linguagem de programac¸a˜o funcional suporta e encoraja
a aplicac¸a˜o do estilo funcional, dirigindo a decomposic¸a˜o dos
problemas em termos de func¸o˜es e composic¸a˜o de func¸o˜es.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Soma de inteiros em uma linguagem imperativa
int total = 0;
for(int i = 1; i <= 5; i++) {
total += i;
}
O me´todo de computac¸a˜o e´ a atribuic¸a˜o de varia´veis
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Soma de inteiros em uma linguagem imperativa
int total = 0;
for(int i = 1; i <= 5; i++) {
total += i;
}
O me´todo de computac¸a˜o e´ a atribuic¸a˜o de varia´veis
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Soma de inteiros em Haskell
> sum [1..5]
Me´todo de computac¸a˜o e´ a aplicac¸a˜o de func¸o˜es; no sentido
de que a execuc¸a˜o de um programa corresponde a uma
sequ¨eˆncia de aplicac¸o˜es de func¸o˜es
Neste exemplo, a func¸a˜o sum (predefinida) e´ aplicada ao
resultado da aplicac¸a˜o da func¸a˜o “geradora” [1..5]
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Soma de inteiros em Haskell
> sum [1..5]
Me´todo de computac¸a˜o e´ a aplicac¸a˜o de func¸o˜es; no sentido
de que a execuc¸a˜o de um programa corresponde a uma
sequ¨eˆncia de aplicac¸o˜es de func¸o˜es
Neste exemplo, a func¸a˜o sum (predefinida) e´ aplicada ao
resultado da aplicac¸a˜o da func¸a˜o “geradora” [1..5]
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Soma de inteiros em Haskell
> sum [1..5]
Me´todo de computac¸a˜o e´ a aplicac¸a˜o de func¸o˜es; no sentido
de que a execuc¸a˜o de um programa corresponde a uma
sequ¨eˆncia de aplicac¸o˜es de func¸o˜es
Neste exemplo, a func¸a˜o sum (predefinida) e´ aplicada ao
resultado da aplicac¸a˜o da func¸a˜o “geradora” [1..5]
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Computac¸a˜o atrave´s de reescrita (ou Calculation)
Considerando que:
sum [] = 0
sum (x:xs) = x + sum xs
sum [1..5] = sum [1, 2, 3, 4, 5], definic¸a˜o de [..] (1)
= 1 + sum [2, 3, 4, 5], definic¸a˜o de sum (2)
= ..., definic¸a˜o de sum (3)
= 1 + 2 + 3 + 4 + sum [5], definic¸a˜o de sum (4)
= 1 + 2 + 3 + 4 + 5 + sum [], definic¸a˜o de sum (5)
= 1 + 2 + 3 + 4 + 5 + 0, definic¸a˜o de sum (6)
= 15, definic¸a˜o de (+) (7)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Computac¸a˜o atrave´s de reescrita (ou Calculation)
Considerando que:
sum [] = 0
sum (x:xs) = x + sum xs
sum [1..5] = sum [1, 2, 3, 4, 5], definic¸a˜o de [..] (1)
= 1 + sum [2, 3, 4, 5], definic¸a˜o de sum (2)
= ..., definic¸a˜o de sum (3)
= 1 + 2 + 3 + 4 + sum [5], definic¸a˜o de sum (4)
= 1 + 2 + 3 + 4 + 5 + sum [], definic¸a˜o de sum (5)
= 1 + 2 + 3 + 4 + 5 + 0, definic¸a˜o de sum (6)
= 15, definic¸a˜o de (+) (7)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Reescrita como mecanismo de prova
Supondo
f a b c = a ∗ (b + c)
Podemos estabelecer que, para qualquer a, b, c , a aplicac¸a˜o
f a b c deve levar sempre a um resultado igual a aplicac¸a˜o f a c b.
f a b c = a ∗ (b + c), definic¸a˜o de f (1)
= a ∗ (c + b), comutatividade da adic¸a˜o (2)
= f a c b, definic¸a˜o de f (3)
Facilidade importante para automac¸a˜o dos testes.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Reescrita como mecanismo de prova
Supondo
f a b c = a ∗ (b + c)
Podemos estabelecer que, para qualquer a, b, c , a aplicac¸a˜o
f a b c deve levar sempre a um resultado igual a aplicac¸a˜o f a c b.
f a b c = a ∗ (b + c), definic¸a˜o de f (1)
= a ∗ (c + b), comutatividade da adic¸a˜o (2)
= f a c b, definic¸a˜o de f (3)
Facilidade importante para automac¸a˜o dos testes.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Reescrita como mecanismo de prova
Supondo
f a b c = a ∗ (b + c)
Podemos estabelecer que, para qualquer a, b, c , a aplicac¸a˜o
f a b c deve levar sempre a um resultado igual a aplicac¸a˜o f a c b.
f a b c = a ∗ (b + c), definic¸a˜o de f (1)
= a ∗ (c + b), comutatividade da adic¸a˜o (2)
= f a c b, definic¸a˜o de f (3)
Facilidade importante para automac¸a˜o dos testes.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Um pouco da “elegaˆncia” de Haskell
q [] = []
q (x:xs) = q ys ++ [x] ++ q zs
where
ys = [a | a ← xs, a ≤ x]
zs = [b | b ← xs, b > x]
?
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Mais alguns exemplos:
module FuncoesMatematicaswhere
somatorio :: (Num t) ⇒ [t] → t
somatorio [] = 0
somatorio (x:xs) = x + (somatorio xs)
tamanho :: [a] → Int
tamanho [] = 0
tamanho (x:xs) = 1 + tamanho xs
produtorio [] = 1
produtorio (x:xs) = x ∗ (produtorio xs)
fatorial n = produtorio [1..n]
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
fatorial’ n
| n == 1 = 1
| n > 1 = n ∗ fatorial’ (n-1)
media valores = somatorio valores ‘div‘ tamanho valores
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Histo´rico (1/2)
Alonzo Church desenvole o λ− calculus (1930).
John McCarthy desenvolve Lisp (1960), a primeira linguagem
funcional com influeˆncias do λ− calculus, mas retendo a
atribuic¸a˜o de varia´veis.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Histo´rico (1/2)
Alonzo Church desenvole o λ− calculus (1930).
John McCarthy desenvolve Lisp (1960), a primeira linguagem
funcional com influeˆncias do λ− calculus, mas retendo a
atribuic¸a˜o de varia´veis.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Histo´rico (2/2)
Va´rias outras linguagens funcionais sa˜o desenvolvidas
(70s—80s), sem atribuic¸a˜o de varia´veis e com eˆnfase em
func¸o˜es de alta ordem e ricos sistemas de tipos (ISWIM, FP,
ML).
Um comiteˆ internacional de pesquisadores incia o
desenvolvimento de Haskell (1987), uma linguagem funcional
padronizada com recursos de avaliac¸a˜o tardia (lazy
evaluation).
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Histo´rico (2/2)
Va´rias outras linguagens funcionais sa˜o desenvolvidas
(70s—80s), sem atribuic¸a˜o de varia´veis e com eˆnfase em
func¸o˜es de alta ordem e ricos sistemas de tipos (ISWIM, FP,
ML).
Um comiteˆ internacional de pesquisadores incia o
desenvolvimento de Haskell (1987), uma linguagem funcional
padronizada com recursos de avaliac¸a˜o tardia (lazy
evaluation).
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Primeiros passos com Haskell
Navegar nas refereˆncias dispon´ıveis em http://www.haskell.org
Utilizar algumas das implementac¸o˜es:
1 Glasgow Haskell Compiler and Interpreter1
2 Hugs Interpreter2
1http://www.haskell.org/ghc
2http://www.haskell.org/hugs
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Haskell
Principais caracter´ısticas
Sintaxe elegante, levando a programas concisos
Linguagem funcional pura, com suporte a avaliac¸a˜o tardia
Casamento de padro˜es
Avanc¸ado sistema de tipos (polimorfismo, infereˆncia, . . . )
Func¸o˜es de alta-ordem
Facilidades para “raciocinar” sobre os programas
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Iniciando uma sessa˜o com GHCi
bash-3.2$ ghci
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude>
Interpretador pronto para avaliar expresso˜es
Prelude> 2 + 3 * 4
14
Prelude> sqrt (3^2 + 4^2)
5.0
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Iniciando uma sessa˜o com GHCi
bash-3.2$ ghci
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude>
Interpretador pronto para avaliar expresso˜es
Prelude> 2 + 3 * 4
14
Prelude> sqrt (3^2 + 4^2)
5.0
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Expresso˜es, valores e tipos
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Expresso˜es e valores
Expresso˜es: Objetos nos quais aplicamos os ca´lculos
(simplificac¸o˜es, substituic¸o˜es ou reescritas de termos).
Valores: Objetos resultantes dos ca´lculos realizados. E´
interessante pensar sobre valores como expresso˜es que na˜o
podem ser ainda mais simplificadas.
Exemplos
Valores atoˆmicos: 42, ’a’, . . .
Valores estruturados: [1, 2, 3], (’b’, 4), . . .
Expresso˜es: 1 + 2, head [1, 2, 3], fst (’b’, 4), . . .
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Expresso˜es e valores
Expresso˜es: Objetos nos quais aplicamos os ca´lculos
(simplificac¸o˜es, substituic¸o˜es ou reescritas de termos).
Valores: Objetos resultantes dos ca´lculos realizados. E´
interessante pensar sobre valores como expresso˜es que na˜o
podem ser ainda mais simplificadas.
Exemplos
Valores atoˆmicos: 42, ’a’, . . .
Valores estruturados: [1, 2, 3], (’b’, 4), . . .
Expresso˜es: 1 + 2, head [1, 2, 3], fst (’b’, 4), . . .
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipos
Toda expressa˜o, e por consequ¨eˆncia todo valor, possui um tipo
associado. Tipos podem ser vistos como conjuntos de
expresso˜es (ou valores) nos quais os membros possuem
caracter´ısticas em comum.
42 :: Integer
′a′ :: Char
[1, 2, 3] :: [Integer ]
(′b′, 4) :: (Char , Integer)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Sistema de tipos Haskell
Implementa um algoritmo que infere os tipos das expresso˜es
Garante que os programas Haskell sa˜o bem tipados (na˜o faz
sentido uma expressa˜o como ′a′ +′ b′), ou seja, Haskell e´ uma
linguagem estaticamente tipada (problemas de tipos sa˜o
identificados antes da execuc¸a˜o)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipos das func¸o˜es
Qual o tipo da func¸a˜o sqr? definida como:
sqr x = x * x
Recebe um valor do tipo Integer, e retorna um outro valor tambe´m
do tipo Integer. Dizermos que a func¸a˜osqr e´ do tipo
Integer → Integer
Se uma func¸a˜o recebe um paraˆmetro de um tipo T1 qualquer
e retorna um valor do tipo T2 qualquer, dizermos:
1 tal func¸a˜o mapea valores do tipo T1 em valores do tipo T2
2 tal func¸a˜o e´ associada ao tipo: T1 → T2
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipos das func¸o˜es
Qual o tipo da func¸a˜o sqr? definida como:
sqr x = x * x
Recebe um valor do tipo Integer, e retorna um outro valor tambe´m
do tipo Integer. Dizermos que a func¸a˜o sqr e´ do tipo
Integer → Integer
Se uma func¸a˜o recebe um paraˆmetro de um tipo T1 qualquer
e retorna um valor do tipo T2 qualquer, dizermos:
1 tal func¸a˜o mapea valores do tipo T1 em valores do tipo T2
2 tal func¸a˜o e´ associada ao tipo: T1 → T2
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipos das func¸o˜es
Qual o tipo da func¸a˜o sqr? definida como:
sqr x = x * x
Recebe um valor do tipo Integer, e retorna um outro valor tambe´m
do tipo Integer. Dizermos que a func¸a˜o sqr e´ do tipo
Integer → Integer
Se uma func¸a˜o recebe um paraˆmetro de um tipo T1 qualquer
e retorna um valor do tipo T2 qualquer, dizermos:
1 tal func¸a˜o mapea valores do tipo T1 em valores do tipo T2
2 tal func¸a˜o e´ associada ao tipo: T1 → T2
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Generalizando
Se existirem n-1 argumentos {A1,A2, ...,An−1} para uma
func¸a˜o f , tal que A1 :: T1, A2 :: T2, . . . , An−1 :: Tn−1 e o tipo
do retorno de f for Tn, indicamos que:
f :: T1 → T2 → ...→ Tn−1 → Tn
E podemos escrever:
f :: Integer -> Integer -> Integer -> Integer
f a b c = a * (a + b)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Generalizando
Se existirem n-1 argumentos {A1,A2, ...,An−1} para uma
func¸a˜o f , tal que A1 :: T1, A2 :: T2, . . . , An−1 :: Tn−1 e o tipo
do retorno de f for Tn, indicamos que:
f :: T1 → T2 → ...→ Tn−1 → Tn
E podemos escrever:
f :: Integer -> Integer -> Integer -> Integer
f a b c = a * (a + b)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Infereˆncia de tipos
A chave para esse processo e´ uma regra de tipagem para a
aplicac¸a˜o de func¸o˜es, indicando que se f e´ uma func¸a˜o que mapea
argumentos do tipo T1 em um resultado do tipo T2, e exp e´ uma
expressa˜o do tipo T1, enta˜o a aplicac¸a˜o f exp tem tipo T2.
f :: T1 → T2 exp :: T1
f exp :: T2
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Infereˆncia de tipos
A chave para esse processo e´ uma regra de tipagem para a
aplicac¸a˜o de func¸o˜es, indicando que se f e´ uma func¸a˜o que mapea
argumentos do tipo T1 em um resultado do tipo T2, e exp e´ uma
expressa˜o do tipo T1, enta˜o a aplicac¸a˜o f exp tem tipo T2.
f :: T1 → T2 exp :: T1
f exp :: T2
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Haskell School of Expression, P. Hudak
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Nomeac¸a˜o
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Nomeac¸a˜o
Dada a inconvenieˆncia de redigitar o valor de pi (pelo menos com
mais de quatro casas decimais), e´ interessante atribuir um nome a
esse valor.
pi :: Float
pi = 3.14159
Sendo poss´ıvel usar o nome pi em qualquer expressa˜o que
referencia o valor de pi.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Nomeac¸a˜o
Dada a inconvenieˆncia de redigitar o valor de pi (pelo menos com
mais de quatro casas decimais), e´ interessante atribuir um nome a
esse valor.
pi :: Float
pi = 3.14159
Sendo poss´ıvel usar o nome pi em qualquer expressa˜o que
referencia o valor de pi.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como reescrever a func¸a˜o x?, definida como:
x :: Float
x = f (a - b + 2) + g y (a - b + 2)
Primeira soluc¸a˜o:
c = a - b + 2
x :: Float
x = f c + g y c
Caso o valor c na˜o seja usado em outros contextos da aplicac¸a˜o,
podemos usar tanto expresso˜es let quanto cla´usulas where.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como reescrever a func¸a˜o x?, definida como:
x :: Float
x = f (a - b + 2) + g y (a - b + 2)
Primeira soluc¸a˜o:
c = a - b + 2
x :: Float
x = f c + g y c
Caso o valor c na˜o seja usado em outros contextos da aplicac¸a˜o,
podemos usar tanto expresso˜es let quanto cla´usulas where.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Expresso˜es let e cla´usulas where
x :: Float
x =
let c = a - b + 2
in f c + g y c
x :: Float
x = f c + g y c
where c = a - b + 2
Ambas as alternatives restringem o escopo atribuido a c.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Expresso˜es let e cla´usulas where
x :: Float
x =
let c = a - b + 2
in f c + g y c
x :: Float
x = f c + g y c
where c = a - b + 2
Ambas as alternatives restringem o escopo atribuido a c.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Expresso˜es let e cla´usulas where
x :: Float
x =
let c = a - b + 2
in f c + g y c
x :: Float
x = f c + g y c
where c = a - b + 2
Ambas as alternatives restringem o escopo atribuido a c.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Abstrac¸a˜o funcional
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Abstrac¸a˜o funcional
Seja a func¸a˜o totalAreaque calcula a a´rea de treˆs circulos com
raios r1, r2 e r3.
totalArea :: Float
totalArea = (pi * r1 ^ 2) + (pi * r2 ^ 2) + (pi * r3 ^ 2)
Ocorre uma repetic¸a˜o do padra˜o (pi ∗ r 2), possibilitando uma
abstrac¸a˜o em termos de func¸o˜es.
circleArea :: Float -> Float
circleArea r = (pi * r ^ 2)
totalArea :: Float
totalArea = circleArea r1 + circleArea r2 + circleArea r3
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Abstrac¸a˜o funcional
Seja a func¸a˜o totalArea que calcula a a´rea de treˆs circulos com
raios r1, r2 e r3.
totalArea :: Float
totalArea = (pi * r1 ^ 2) + (pi * r2 ^ 2) + (pi * r3 ^ 2)
Ocorre uma repetic¸a˜o do padra˜o (pi ∗ r 2), possibilitando uma
abstrac¸a˜o em termos de func¸o˜es.
circleArea :: Float -> Float
circleArea r = (pi * r ^ 2)
totalArea :: Float
totalArea = circleArea r1 + circleArea r2 + circleArea r3
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Mas a func¸a˜o totalArea e´ definida em termos da soma das
a´reas de treˆs c´ırculos. Como generalizar para n c´ırculos?
Abstrac¸a˜o de dados, o tipo List, cujo nu´mero de elementos e´
arbitra´rio, parece ser interessante.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo de dados List
Tipo de dados composto, onde
[1, 2, 3] corresponde a uma lista de inteiros
[] corresponde a uma lista vazia
x : xs e´ uma expressa˜o que adiciona x :: T a lista xs :: [T ]
Ou seja, a lista [1, 2, 3] e´ equivalente a expressa˜o:
1 : (2 : (3 : [])) == 1 : 2 : 3 : []
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo de dados List
Tipo de dados composto, onde
[1, 2, 3] corresponde a uma lista de inteiros
[] corresponde a uma lista vazia
x : xs e´ uma expressa˜o que adiciona x :: T a lista xs :: [T ]
Ou seja, a lista [1, 2, 3] e´ equivalente a expressa˜o:
1 : (2 : (3 : [])) == 1 : 2 : 3 : []
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Existem va´rias func¸o˜es predefinidas que manipulam listas, nos
mo´dulos Prelude e Data.List
head, tail
length
(++)
reverse
. . .
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Voltando ao exemplo,
Precisamos de uma func¸a˜o que calcule a soma de uma lista do tipo
float (depois discutimos como generalizar). Para isso, induc¸a˜o
sobre listas, recursa˜o e casamento de padro˜es podem ser usados:
sumList :: [Float] -> Float
sumList [] = 0 -- caso base da recursao
sumList (x:xs) = x + sumList xs
E finalmente escrever totalArea como:
totalArea = sumList [circleArea r1
,circleArea r2
,circleArea r3]
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Voltando ao exemplo,
Precisamos de uma func¸a˜o que calcule a soma de uma lista do tipo
float (depois discutimos como generalizar). Para isso, induc¸a˜o
sobre listas, recursa˜o e casamento de padro˜es podem ser usados:
sumList :: [Float] -> Float
sumList [] = 0 -- caso base da recursao
sumList (x:xs) = x + sumList xs
E finalmente escrever totalArea como:
totalArea = sumList [circleArea r1
,circleArea r2
,circleArea r3]
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipos abstratos de dados
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Nossa tarefa . . .
Implementar um mo´dulo para manipulac¸a˜o de formas geome´tricas;
o que corresponde a um conjunto de func¸o˜es e tipos de dados que
realizam computac¸o˜es sobre c´ırculos, quadrados, triaˆngulos, . . . .
Inicialmente, usua´rios desse mo´dulo podera˜o:
criar instaˆncias de formas geome´tricas
computar a a´rea dessas formas
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Nossa tarefa . . .
Implementar um mo´dulo para manipulac¸a˜o de formas geome´tricas;
o que corresponde a um conjunto de func¸o˜es e tipos de dados que
realizam computac¸o˜es sobre c´ırculos, quadrados, triaˆngulos, . . . .
Inicialmente, usua´rios desse mo´dulo podera˜o:
criar instaˆncias de formas geome´tricas
computar a a´rea dessas formas
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Antes de iniciarmos a implementac¸a˜o
Design modular e´ uma propriedade chave dos produtos,
possibilitando o desenvolvimento, o entendimento e a evoluc¸a˜o
independente das partes.
Abstrac¸a˜o e´ uma das formas de alcanc¸ar modularidade
Um mo´dulo Haskell possibilita abstrac¸a˜o, pois e´ uma forma de
agrupar tipos e func¸o˜es associados a um dom´ınio, ao mesmo
tempo que expo˜e apenas o que e´ essencial para a utilizac¸a˜o do
mo´dulo.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Antes de iniciarmos a implementac¸a˜o
Design modular e´ uma propriedade chave dos produtos,
possibilitando o desenvolvimento, o entendimento e a evoluc¸a˜o
independente das partes.
Abstrac¸a˜o e´ uma das formas de alcanc¸ar modularidade
Um mo´dulo Haskell possibilita abstrac¸a˜o, pois e´ uma forma de
agrupar tipos e func¸o˜es associados a um dom´ınio, ao mesmo
tempo que expo˜e apenas o que e´ essencial para a utilizac¸a˜o do
mo´dulo.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Alternativas de design
Uma func¸a˜o area para cada tipo de forma geome´trica?
Um tipo de dados que captura todas as formas geome´tricas, e
uma u´nica func¸a˜o para o ca´lculo da a´rea?
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo ba´sico para formas geome´tricas
data Shape = Circle Float
| Square Float
Limitac¸o˜es
Existem mais formas geome´tricas que c´ırculos e quadrados
Quadrados na verdade sa˜o retaˆngulos, retaˆngulos sa˜o
paralelogramas, paralelogramas sa˜o quadrila´teros, . . .
Qual a melhor alternativa de design? ⇒ Depende da
aplicac¸a˜o, vamos seguir uma alternativa de design mais
gene´rica, por outro lado, pode na˜o ser a mais adequada paraum determinado cena´rio.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo ba´sico para formas geome´tricas
data Shape = Circle Float
| Square Float
Limitac¸o˜es
Existem mais formas geome´tricas que c´ırculos e quadrados
Quadrados na verdade sa˜o retaˆngulos, retaˆngulos sa˜o
paralelogramas, paralelogramas sa˜o quadrila´teros, . . .
Qual a melhor alternativa de design? ⇒ Depende da
aplicac¸a˜o, vamos seguir uma alternativa de design mais
gene´rica, por outro lado, pode na˜o ser a mais adequada para
um determinado cena´rio.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo ba´sico para formas geome´tricas
data Shape = Circle Float
| Square Float
Limitac¸o˜es
Existem mais formas geome´tricas que c´ırculos e quadrados
Quadrados na verdade sa˜o retaˆngulos, retaˆngulos sa˜o
paralelogramas, paralelogramas sa˜o quadrila´teros, . . .
Qual a melhor alternativa de design?
⇒ Depende da
aplicac¸a˜o, vamos seguir uma alternativa de design mais
gene´rica, por outro lado, pode na˜o ser a mais adequada para
um determinado cena´rio.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo ba´sico para formas geome´tricas
data Shape = Circle Float
| Square Float
Limitac¸o˜es
Existem mais formas geome´tricas que c´ırculos e quadrados
Quadrados na verdade sa˜o retaˆngulos, retaˆngulos sa˜o
paralelogramas, paralelogramas sa˜o quadrila´teros, . . .
Qual a melhor alternativa de design? ⇒ Depende da
aplicac¸a˜o, vamos seguir uma alternativa de design mais
gene´rica, por outro lado, pode na˜o ser a mais adequada para
um determinado cena´rio.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo “pedago´gico” para formas geome´tricas (1/2)
data Shape = Rectangle Float Float
| Ellipse Float Float
| RtTriangle Float Float
| Polygon [(Float, Float)]
deriving(Show)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Tipo “pedago´gico” para formas geome´tricas (2/2)
data Shape = Rectangle Side Side
| Ellipse Radius Radius
| RtTriangle Side Side
| Polygon [Vertex]
deriving(Show)
type Side = Float
type Radius = Float
type Vertex = (Float, Float)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como construir quadrados e c´ırculos?
Precisamos de func¸o˜es auxiliares:
square s = Rectangle s s
circle r = Ellypse r r
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como construir quadrados e c´ırculos?
Precisamos de func¸o˜es auxiliares:
square s = Rectangle s s
circle r = Ellypse r r
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como calcular a a´rea das formas geome´tricas?
Primeiro, precisamos definir uma interface da func¸a˜o area
area :: Shape -> Float
Algumas implementac¸o˜es sa˜o triviais:
area (Rectangle s1 s2) = s1 * s2
area (RtTriangle s1 s2) = (s1 * s2) / 2
area (Ellipse r1 r2) = pi * r1 * r2
Aqui temos a definic¸a˜o da func¸a˜o area em termos de
casamento de padro˜es!
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como calcular a a´rea das formas geome´tricas?
Primeiro, precisamos definir uma interface da func¸a˜o area
area :: Shape -> Float
Algumas implementac¸o˜es sa˜o triviais:
area (Rectangle s1 s2) = s1 * s2
area (RtTriangle s1 s2) = (s1 * s2) / 2
area (Ellipse r1 r2) = pi * r1 * r2
Aqui temos a definic¸a˜o da func¸a˜o area em termos de
casamento de padro˜es!
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como calcular a a´rea das formas geome´tricas?
Primeiro, precisamos definir uma interface da func¸a˜o area
area :: Shape -> Float
Algumas implementac¸o˜es sa˜o triviais:
area (Rectangle s1 s2) = s1 * s2
area (RtTriangle s1 s2) = (s1 * s2) / 2
area (Ellipse r1 r2) = pi * r1 * r2
Aqui temos a definic¸a˜o da func¸a˜o area em termos de
casamento de padro˜es!
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Como calcular a a´rea das formas geome´tricas?
Primeiro, precisamos definir uma interface da func¸a˜o area
area :: Shape -> Float
Algumas implementac¸o˜es sa˜o triviais:
area (Rectangle s1 s2) = s1 * s2
area (RtTriangle s1 s2) = (s1 * s2) / 2
area (Ellipse r1 r2) = pi * r1 * r2
Aqui temos a definic¸a˜o da func¸a˜o area em termos de
casamento de padro˜es!
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
E a a´rea de um pol´ıgono?
Algoritmo:
(a) Calcular a area do triaˆngulo formado pelos 3 primeiros ve´rtices.
(b) Excluir o segundo ve´rtice (dos n ve´rtices do pol´ıgono),
formando um novo pol´ıgono com n − 1 ve´rtices.
(c) Caso o pol´ıgono resultante tenha pelo menos 3 ve´rtices, repetir
o processo, retornando a a´rea total como a soma das a´reas dos
triaˆngulos individuais.
The Haskell school of expression, P Hudak.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
E a a´rea de um pol´ıgono?
Algoritmo:
(a) Calcular a area do triaˆngulo formado pelos 3 primeiros ve´rtices.
(b) Excluir o segundo ve´rtice (dos n ve´rtices do pol´ıgono),
formando um novo pol´ıgono com n − 1 ve´rtices.
(c) Caso o pol´ıgono resultante tenha pelo menos 3 ve´rtices, repetir
o processo, retornando a a´rea total como a soma das a´reas dos
triaˆngulos individuais.
The Haskell school of expression, P Hudak.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
E a a´rea de um pol´ıgono?
Algoritmo:
(a) Calcular a area do triaˆngulo formado pelos 3 primeiros ve´rtices.
(b) Excluir o segundo ve´rtice (dos n ve´rtices do pol´ıgono),
formando um novo pol´ıgono com n − 1 ve´rtices.
(c) Caso o pol´ıgono resultante tenha pelo menos 3 ve´rtices, repetir
o processo, retornando a a´rea total como a soma das a´reas dos
triaˆngulos individuais.
The Haskell school of expression, P Hudak.Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
A´rea de um pol´ıgono em Haskell
area(Polygon(v1:v2:v3:vs)) = triArea v1 v2 v3 + area(Polygon(v1:v3:vs))
area(Polygon _) = 0
Mas existe a possibilidade de otimizac¸a˜o. Nessa implementac¸a˜o,
um Poligono e´ constru´ıdo a cada iterac¸a˜o; e o primeiro ve´rtice
nunca e´ descartado (pode existir uma alternativa de na˜o passa´-lo
como argumento a cada iterac¸a˜o).
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
A´rea de um pol´ıgono em Haskell
area(Polygon(v1:v2:v3:vs)) = triArea v1 v2 v3 + area(Polygon(v1:v3:vs))
area(Polygon _) = 0
Mas existe a possibilidade de otimizac¸a˜o. Nessa implementac¸a˜o,
um Poligono e´ constru´ıdo a cada iterac¸a˜o; e o primeiro ve´rtice
nunca e´ descartado (pode existir uma alternativa de na˜o passa´-lo
como argumento a cada iterac¸a˜o).
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
A´rea de um pol´ıgono em Haskell, versa˜o otimizada
area (Polygon (v1:vs)) = polyArea vs
where
polyArea :: [Vertex] -> Float
polyArea (v2:v3:vs’) = triArea v1 v2 v3 + polyArea (v3 : vs’)
polyArea _ = 0
Falta apenas a implementac¸a˜o da func¸a˜o triArea. A a´rea de um
triaˆngulo qualquer, de lados a, b e c pode ser calculada como:
At =
√
s(s − a)(s − b)(s − c), onde s = 12 (a + b + c)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
A´rea de um pol´ıgono em Haskell, versa˜o otimizada
area (Polygon (v1:vs)) = polyArea vs
where
polyArea :: [Vertex] -> Float
polyArea (v2:v3:vs’) = triArea v1 v2 v3 + polyArea (v3 : vs’)
polyArea _ = 0
Falta apenas a implementac¸a˜o da func¸a˜o triArea. A a´rea de um
triaˆngulo qualquer, de lados a, b e c pode ser calculada como:
At =
√
s(s − a)(s − b)(s − c), onde s = 12 (a + b + c)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
. . . , ou seja
A a´rea de um triaˆngulo, de ve´rtices v1, v2 e v3, pode ser calculada
como:
triArea :: Vertex -> Vertex -> Vertex -> Float
triArea v1 v2 v3 = sqrt (s* (s-a) * (s-b) * (s-c))
where
a = distBetween v1 v2
b = distBetween v2 v3
c = distBetween v3 v1
s = 0.5 * (a + b + c)
E adistaˆncia entre dois ve´rtices:
distBetween:: Vertex -> Vertex -> Float
distBetween (i,j) (k, l) = sqrt ((i-k)^2 + (j-l)^2)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
. . . , ou seja
A a´rea de um triaˆngulo, de ve´rtices v1, v2 e v3, pode ser calculada
como:
triArea :: Vertex -> Vertex -> Vertex -> Float
triArea v1 v2 v3 = sqrt (s* (s-a) * (s-b) * (s-c))
where
a = distBetween v1 v2
b = distBetween v2 v3
c = distBetween v3 v1
s = 0.5 * (a + b + c)
E adistaˆncia entre dois ve´rtices:
distBetween:: Vertex -> Vertex -> Float
distBetween (i,j) (k, l) = sqrt ((i-k)^2 + (j-l)^2)
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
As definic¸o˜es finais de cada func¸a˜o e do tipo de dados Shape
devem ser agrupadas em um mo´dulo Haskell (em geral, um
arquivo com a extensa˜o “.hs”, iniciando com:)
module Shape (
Shape(Rectangle, Ellipse, RtTriangle, Polygon)
Radius, Side, Vertex,
square, circle, distBetween, are
) where
-- restante das definicoes.
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
Introduc¸a˜o
Expresso˜es, valores e tipos
Abstrac¸a˜o
Testes unita´rios em Haskell
Test Infected: Programmers
Love Writing Tests . . .
HUnit
Haskell QuickCheck
Rodrigo Bonifa´cio Introduc¸a˜o a Linguagem Funcional Haskell Reescrita, Expresso˜es, Tipos Ba´sicos e Abstrac¸o˜es
	Introdução
	Expressões, valores e tipos
	Abstração
	Testes unitários em Haskell

Outros materiais