Introdução à Programação Uma Abordagem Funcional
Tipos em Haskell
Linguagem fortemente tipada Em Haskell, conhecendo-se o tipo das operações e funções que compõem uma expressão podemos determinar o tipo do valor que dela resultará; Em linguagens de programação isto equivale a dizer que a linguagem é fortemente tipada.
O que é um tipo? Um tipo é um nome para uma coleção de valores relacionados. Por exemplo, em Haskell o tipo básico Bool contém os dois valores lógicos: False True
Erros de tipo A aplicação de uma função a um ou mais argumentos do tipo errado constitui um erro de tipo. Por exemplo: 1 é um número e False é um valor lógico, mas + requer dois números.
Tipos em Haskell Se a avaliação de uma expressão e produz um valor do tipo t, então o tipo de e é t, e escrevemos: e :: t Toda expressão bem formada tem um tipo, que pode ser calculado automaticamente em tempo de compilação usando um processo chamado inferência de tipos.
Tipos em Haskell Todos os erros de tipo são encontrados em tempo de compilação, o que torna os programas mais seguros e mais rápidos, eliminando a necessidade de verificações de tipo em tempo de execução. No GHCi, o comando :type calcula o tipo de uma expressão, sem avaliá-la:
Tipos Básicos Haskell tem vários tipos básicos, como:
Conversão de tipos > 3 + 5 8 :: Integer > 3 + 5.0 8.0 :: Double
Conversão de tipos Existem funções específicas para conversão de tipos: Função truncate converte um real x para o menor inteiro menor ou igual x. > truncate pi 3 :: Integer Função round converte um real x para o inteiro mais próximo de x, ou seja: > round 1.4 1 :: Integer > round 1.5 2 :: Integer
Exercício As funções abaixo são de que tipo? mediaa x y = (x + y) / 2 mediab x y = truncate((x + y) / 2)
Condicional em Haskell
Estrutura IF-THEN-ELSE Sintaxe: if <expressão lógica> then <expressão 1> else <expressão 2> <expressão lógica> True False <expressão 1> <expressão 2>
Expressão condicional A expressão condicional é uma expressão, portanto sempre tem um valor. É possível omitir o else? Se sim, qual seria o valor da expressão quando a condição for falsa? Uma expressão condicional pode ser usada dentro de outra expressão.
Exemplo de expressão condicional
Exercício Considere a função que determina o valor da passagem aérea de um adulto, para um determinado trecho, por exemplo, Vitória-Manaus, considerando a sua idade. Pessoas com idade a partir de 60 anos possuem um desconto de 40% do valor. Considere ainda que a passagem para o trecho considerado custe R$ 600,00. a) Faça a função em Haskell b) Faça a função genérica para o valor da passagem.
Exemplo - Resolução passagem idade = if idade >= 60 then 600 - (600*0.4) else 600
Exercício Considerando a tabela de Imposto de Renda. Até um determinado valor, o contribuinte não paga imposto, e a partir de então o rendimento é dividido em faixas (intervalos), aos quais se aplicam diferentes taxas. Faça a função Haskell Faixa Alíquota Desconto Inferior ou igual a 10800 0 0 Entre 10801 e 20000 10 1000 Entre 20001 e 30000 20 1500 Acima de 30000 25 1800
Exercício Para os exercícios em sequência faça sua função em Haskell. 1. Dado três números, determine o maior deles; 2. Dados a, b, c informe se formam um triângulo; 3. Se a, b e c formarem um triângulo, informe seu tipo (equilátero, isósceles ou escaleno).
Exercício Para os exercícios em sequência faça sua função em Haskell. 1. Retorne o valor absoluto de N; 2. Retorne o sinal de um número. Ex.: Negativo = -1, igual a zero = 0 e 1 se positivo.
Equações de guarda
Equações com guardas Funções podem ser definidas através de equações com guardas, onde uma sequência de expressões lógicas chamadas guardas é usada para escolher um resultado. Uma equação com guarda é formada por uma sequência de cláusulas escritas logo após a lista de argumentos. Cada cláusula é introduzida por uma barra vertical ( ) e consiste em uma condição chamada guarda e uma expressão (resultado), separados por =.
Equações com guardas Cada guarda é uma expressão lógica. Os resultados devem ser todos do mesmo tipo. Exemplo: valor absoluto de um número
Exemplo Valor absoluto: Nesta definição de abs, as guardas são n >= 0 e n < 0, e as expressões associadas são n e -n, respectivamente.
Equações com guardas Quando a função é aplicada, as guardas são verificadas em sequência. A primeira guarda verdadeira define o resultado. Assim no exemplo anterior o teste n < 0 pode ser substituído pela constante True:
Otherwise otherwise é uma condição que captura todas as outras situações que ainda não foram consideradas. otherwise é definida no prelúdio simplesmente como o valor verdadeiro:
Benefícios Equações com guardas podem ser usadas para tornar definições que envolvem múltiplas condições mais fáceis de ler. Exemplo: determina o sinal de um número:
Benefícios Exemplo: analisa o índice de massa corporal
Matching Se todas as guardas de uma equação forem falsas, a próxima equação é considerada. Se não houver uma próxima equação, ocorre um erro.
Erro comum Um erro comum cometido por iniciantes é colocar um sinal de igual (=) depois do nome da função e parâmetros, antes da primeira guarda. Isso é um erro de sintaxe.
Exercício Para todos os exercícios, faça uma versão usando IF-ELSE e outra com Guard command. 1. Função que informe se um caractere é maiúsculo, minúsculo ou se não é uma letra. 2. Função retorna o maior de 2 valores. 3. Função retorna o maior de 3 valores.
Resolução describeletter c = if c >= 'a' && c <= 'z' then "Lower case" else if c >= 'A' && c <= 'Z' then "Upper case" else Nao e letra" describeletter c c >= 'a' && c <= 'z' = "Lower case" c >= 'A' && c <= 'Z' = "Upper case" otherwise = "Not an ASCII letter