Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres 2009/1 A linguagem de programação Haskell e o ambiente Hugs linguagem Haskell: oferece uma sintaxe simples e elegante; ambiente HUGS: uma implementação da linguagem de programação funcional Haskell; provê um avaliador de expressões descritas por funções o avaliador funciona por meio de um interpretador, que interpreta as expressões para o computador Avaliador do ambiente HUGS Ambiente HUGS avaliador: pode ser usado como uma calculadora: ?3+5*2 13 ? (3 + 5) * 2 16 ? primitivas: funções já existentes em bibliotecas do HUGS Primeiras operações e primitivas... Operador Denominação Número de argumentos notação exemplo + soma binário infixada/ pré-fixada 2+3 (+) 2 3 - Subtração/ simetria binário/ unário infixada/ pré-fixada 5–2 (-) 5 2 -3 * multiplicação binário infixada/ pré-fixada 7*3 (*) 7 3 / divisão binário infixada/ pré-fixada 5/2 (/) 5 2 ^ potência binário infixada/ pré-fixada 2^2 (^) 2 2 div divisão inteira binário pré-fixada div 5 2 mod resto da divisão binário inteira pré-fixada mod 5 2 Exemplo Hugs> 4 * 3 – 2 10 exemplo1.hs fx=x+1 Hugs> f 2 + 10 ERROR - Undefined variable "f" Hugs>:load “c:\boeres\exemplo1.hs” Main> f 2 + 10 13 hugs Descrição de funções Scripts: Funções devem ser descritas em um arquivo texto. f x y = x*y nome da parâmetros função expressão aritmética que define a relação que há entre os parâmetros interface da função corpo da definição Interações do programador com o ambiente de programação Editor de texto Arquivo texto com definições de funções Ambiente Interpretador HUGS Programador Exemplo: Cálculo da hipotenusa de um triângulo retângulo Dados os catetos a e b de um triângulo retângulo, calcular a sua hipotenusa. hugs Definições locais restritas ao contexto específico da definição de uma função. Exemplo: hipo x y = sqrt (quad x + quad y) where quad x = x * x Definições locais – mais exemplos hipo1 x y = sqrt (k1 + k2) where k1 = x * x k2 = y * y hipo2 x y = sqrt (k1 + k2) where k1 = x * x; k2 = y * y hipo3 x y = sqrt k where k = quad x + quad y where quad x = x * x Avaliação de expressões ordem expressão redução aplicada 1 2 3 hipo 3 5 + hipo 4 4 sqrt ( quad 3 + quad 5) + hipo 4 4 sqrt ( 3 * 3 + quad 5) + hipo 4 4 expressão inicial def de hipo def de quad 4 5 6 sqrt (3 * 3 + 5 * 5) + hipo 4 4 sqrt (3 * 3 + 5 * 5) + sqrt (quad 4 + quad 4) sqrt (3 * 3 + 5 * 5) + sqrt (4 * 4 + quad 4) def de quad def de hipo def de quad 7 8 9 10 11 12 13 14 15 16 sqrt (3 * 3 + 5 * 5) + sqrt (4 * 4 + 4 * 4) sqrt (9 + 5 * 5) + sqrt (4 * 4 + 4 * 4) sqrt (9 + 25) + sqrt (4 * 4 + 4 * 4) sqrt 34 + sqrt (4 * 4 + 4 * 4) 5.83095 + sqrt (4 * 4 + 4 * 4) 5.83095 + sqrt (16 + 4 * 4) 5.83095 + sqrt (16 + 16) 5.83095 + sqrt (32) 5.83095 + 5.65685 11.4878 def de quad * * + sqrt * * + sqrt + Assinatura de funções e a notação Curry Para conhecer o tipo de uma função, disponível na biblioteca do HUGS ou construída pelo programador, basta usar, no ambiente HUGS, o comando: Hugs> :t <nome da função> Exemplos Hugs> :t sqrt sqrt :: Floating a => a -> a Hugs> :t sin sin :: Floating a => a -> a Hugs> :t abs abs :: Num a => a -> a Hugs> :t mod mod :: Integral a => a -> a -> a Hugs> :t div div :: Integral a => a -> a -> a Exemplo: média aritmética de três números reais definição: ma3 x y z = (x + y + z)/3 assinatura: ma3 :: xx notação curry: toda função tem sempre um único parâmetro de entrada a aplicação de uma função sobre um parâmetro produz uma nova função assinatura: ma3 :: Máquina Funcional ma3 3 4 5 “(x + y + z)/3” 4 5 “( 3 + y + z)/3” 4 5 “(3 + 4 + z)/3” 5 “(3 + 4 + 5)/3” “(7 + 5)/3” “12/3” 4 Exercícios: 1) Avalie as expressões abaixo e apresente a sequência de reduções necessárias para a obtenção do termo irredutível (resultado final): a. mod 15 2 b. mod 15 2 + div 6 3 c. ma3 5 10 2 d. sqrt (15 – 2*3) / (17 – 12) 2) Defina na linguagem Haskell as funções abaixo. Use, quando achar adequado, definições locais: a. Determinação da área de um retângulo de lados a e b b. Determinação da área de um círculo de raio r c. Determinação da média aritmética de três números a, b e c d. Determinação da distância entre dois pontos