Baixe o app para aproveitar ainda mais
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
Compartilhar