Buscar

04-condicionais

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 3, do total de 38 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

Você também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 6, do total de 38 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

Você também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 9, do total de 38 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

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1/38
Programação Funcional
Capítulo 4
Expressões Condicionais
José Romildo Malaquias
Departamento de Computação
Universidade Federal de Ouro Preto
2013.1
2/38
1 Combinando funções
2 Expressão condicional
3 Definição de função com expressão condicional
4 Equaçao com guardas
3/38
Tópicos
1 Combinando funções
2 Expressão condicional
3 Definição de função com expressão condicional
4 Equaçao com guardas
4/38
Redefinindo funções do prelúdio
O módulo Prelude é importado automaticamente em todos os módulos de uma
aplicação em Haskell.
Um nome que já tenha sido definido não pode ser redefinido.
Como escrever uma definição usando um nome que já é utilizado em algum
módulo?
Podemos omitir alguns nomes ao importar um módulo, usando a declaraçãoimport hiding.
5/38
Redefinindo funções do prelúdio (cont.)
Exemplo:
Para fazermos nossas próprias definições de even e odd, que já são definidas no
módulo Prelude:
import Prelude hiding (even, odd)
even n = mod n 2 == 0
odd n = not (even n)
6/38
Combinando funções
A maneira mais simples de definir novas funções é simplesmente pela
combinação de uma ou mais funções existentes.
7/38
Combinando funções (cont.)
Exemplo:
Verificar se um caracter é um dígito decimal:
isDigit :: Char -> Bool
isDigit c = c >= ’0’ && c <= ’9’
8/38
Combinando funções (cont.)
Exemplo:
Verificar se um número inteiro é par:
even :: Integral a => a -> Bool
even n = mod n 2 == 0
9/38
Combinando funções (cont.)
Exemplo:
Dividir uma lista em duas partes:
splitAt :: Int -> [a] -> ([a],[a])
splitAt n xs = (take n xs,drop n xs)
10/38
Combinando funções (cont.)
Exemplo:
Calcular o recíproco de um número:
recip :: Fractional a => a -> a
recip n = 1/n
11/38
Tópicos
1 Combinando funções
2 Expressão condicional
3 Definição de função com expressão condicional
4 Equaçao com guardas
12/38
Expressões condicionais
Uma expressão condicional tem a forma
if condição then exp1 else exp2
onde condição é uma expressão booleana (chamada predicado) e exp1
(chamada consequência) e exp2 (chamada alternativa) são expressões de um
mesmo tipo.
O valor da expressão condicional é o valor de exp1 se a condição é verdadeira,
ou o valor de exp2 se a condição é falsa.
Exemplos:
if True then 1 else 2 1if False then 1 else 2 2if 2>1 then "OK" else "FAIL" "OK"if even 5 then 3+2 else 3-2 1
13/38
Expressões condicionais (cont.)
A expressão condicional é uma expressão, portanto sempre tem um valor.
Assim uma expressão condicional pode ser usada dentro de outra expressão.
Exemplos:
5 * (if True then 10 else 20) 50
5 * if True then 10 else 20 50
(if even 2 then 10 else 20) + 1 11if even 2 then 10 else 20 + 1 10
length (if 2<=1 then "OK" else "FAIL") 4
Observe que uma expressão condicional se extende à direita o quanto for
possível.
14/38
Expressões condicionais (cont.)
A cláusula else não é opcional em uma expressão condicional. Omiti-la é um
erro de sintaxe.
Exemplo:
if True then 10 ERRO DE SINTAXE
Se fosse possível omiti-la, qual seria o valor da expressão quando a condição
fosse falsa?
15/38
Expressões condicionais (cont.)
Regra de inferência:
test :: Bool e1 :: a e2 :: a
if test then e1 else e2 :: a
Observe que a consequência e a alternativa devem ser do mesmo tipo, que
também é o tipo do resultado.
Exemplos:
Prelude> :type if True then 10 else 20
if True then 10 else 20 :: Num a => a
Prelude> :type if 4>5 then "ok" else "bad"
if 4>5 then "ok" else "bad" :: [Char]
16/38
Expressões condicionais (cont.)
Prelude> if length [1,2,3] then "ok" else "bad"
<interactive>:0:4:
Couldn’t match expected type ‘Bool’ with actual type ‘Int’
In the return type of a call of ‘length’
In the expression: length [1, 2, 3]
In the expression: if length [1, 2, 3] then "ok" else "bad"
Prelude> if 4>5 then "ok" else ’H’
<interactive>:0:23:
Couldn’t match expected type ‘[Char]’ with actual type ‘Char’
In the expression: ’H’
In the expression: if 4 > 5 then "ok" else ’H’
In an equation for ‘it’: it = if 4 > 5 then "ok" else ’H’
17/38
Tópicos
1 Combinando funções
2 Expressão condicional
3 Definição de função com expressão condicional
4 Equaçao com guardas
18/38
Definindo funções com expressões condicionais
Como na maioria das linguagens de programação, funções podem ser definidas
usando expressões condicionais.
Exemplo:
Valor absoluto
abs :: Int -> Int
abs n = if n >= 0 then n else -n
abs recebe um inteiro n e retorna n se ele é não-negativo, e -n caso contrário.
19/38
Expressões condicionais aninhadas
Expressões condicionais podem ser aninhadas.
Exemplo:
Sinal de um número:
signum :: Int -> Int
signum n = if n < 0then -1else if n == 0then 0else 1
Em Haskell, expressões condicionais sempre devem ter as duas alternativas.
Isto evita qualquer possível problema de ambigüidade com expressões
condicionais aninhadas.
20/38
Tópicos
1 Combinando funções
2 Expressão condicional
3 Definição de função com expressão condicional
4 Equaçao com guardas
21/38
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
entre vários possíveis resultados.
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 =.
f arg1 ... argn| guarda1 = exp1...
| guardam = expm
Cada guarda deve ser uma expressão lógica.
Os resultados devem ser todos do mesmo tipo.
Quando a função é aplicada, as guardas são verificadas em sequência. A
primeira guarda verdadeira define o resultado.
22/38
Exemplo: valor absoluto
Valor absoluto:
vabs :: (Num a, Ord a) => a -> a
vabs n | n >= 0 = n
| n < 0 = -n
Nesta definição de abs, as guardas são
n >= 0
n < 0
e as expressões associadas são respectivamente
n
-n
23/38
Exemplo: valor absoluto (cont.)
Aplicação da função:
vabs n | n >= 0 = n
| n < 0 = -n
vabs 89
?? 89 >= 0
?? True
 89
Observe que quando o cálculo do valor de uma expressão é escrito passo a
passo, indicamos o cálculo das guardas separadamente em linhas que começam
com ??.
24/38
Exemplo: valor absoluto (cont.)
Outra aplicação:
vabs (75 - 2*50)
?? 75 - 2*50 >= 0
?? 75 - 100 >= 0
?? -25 >= 0
?? False
?? -25 < 0
?? True
 - (-25)
 25
Note que o argumento (75 - 2*50) é avaliado uma única vez, na primeira vez em
que ele é necessário (para verificar a primeira guarda).
O seu valor não é recalculado quando o argumento é usado novamente na segunda
guarda ou no resultado.
Esta é uma característica da avaliação lazy: um argumento é avaliado somente se o
seu valor for necessário, e o seu valor é guardado caso ele seja necessário
novamente.
Logo um argumento nunca é avaliado mais de uma vez.
25/38
otherwise
Observe novamente a definição de vabs:
vabs n | n >= 0 = n
| n < 0 = -n
Observe que o teste n < 0 pode ser substituído pela constante True, pois ele
somente será usado se o primeiro teste n >= 0 for falso, e se isto acontecer, com
certeza n < 0 é verdadeiro:
vabs n | n >= 0 = n
| True = -n
A condição True pode também ser escrita como otherwise.
Exemplo:
vabs n | n >= 0 = n
| otherwise = -n
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:
otherwise :: Bool
otherwise = True
26/38
Condições múltiplas usando guardas
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 inteiro:
sinal :: Int -> Int
sinal n | n < 0 = -1
| n == 0 = 0
| otherwise = 1
27/38
Condições múltiplas usando guardas (cont.)
Exemplo:
Analisa o índice de massa corporal
analisaIMC :: (Fractional a, Ord a) => a -> String
analisaIMC imc
| imc <= 18.5 = "Voce esta abaixo do peso, seu emo!"
| imc <= 25.0 = "Voce parece normal. Deve ser feio!"
| imc<= 30.0 = "Voce esta gordo! Perca algum peso!"
| otherwise = "Voce esta uma baleia. Parabens!"
28/38
Erros produzidos na aplicação de função com guardas
Uma definição pode ser feita com várias equações.
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.
Exemplo:
minhaFuncao :: (Ord a, Num b) => a -> a -> b
minhaFuncao x y | x > y = 1
| x < y = -1
minhaFuncao 2 3 -1
minhaFuncao 3 2 1
minhaFuncao 2 2 ERRO
29/38
Erros produzidos na aplicação de função com guardas
(cont.)
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.
Exemplo com erro:
minhaFuncao x y= x > y = 1= x < y = -1
30/38
Exercícios
Insruções
Em cada um dos exercícios a seguir em que for apropriado:
Defina a função solicitada de acordo com as instruções.
Especifique o tipo mais geral desta função.
Teste sua função no GHCi.
31/38
Exercícios (cont.)
Exercício 1
Defina uma função chamada media3 que recebe três valores e retorna a sua média
aritmética.
Exercício 2
Defina uma função chamada penultimo que recebe uma lista e retorna o seu
penúltimo elemento.
Exercício 3
Defina a função em3linhas que recebe três strings e resulta em uma única string que
quando exibida apresenta as três strings em linhas separadas.
32/38
Exercícios (cont.)
Exercício 4
Dada a definição de função
vabs :: Int -> Int
vabs n = if n >= 0then nelse -n
mostre o cálculo passo a passo das expressões:
1. vabs (div 43 10)
2. vabs ((6-2)^3)
33/38
Exercícios (cont.)
Exercício 5
Dada a definição de função
min3 a b c | a < b && a < c = a
| b < c = b
| otherwise = c
mostre o cálculo passo a passo das expressões:
1. min3 2 3 4
2. min3 5 (4+3) 6
3. min3 (div 100 7) (2*6) (4+5)
34/38
Exercícios (cont.)
Exercício 6
Defina as funções maximo2 e maximo2’ que recebem dois valores e retorna o maior
deles. Use expressões condicionais e equações com guardas, respectivamente.
Exercício 7
Defina as funções maximo3 e maximo3’ que recebem três valores e retorna o maior
deles. Use expressões condicionais aninhadas e equações com guardas,
respectivamente.
Exercício 8
Defina uma função chamada maximo3’’ que recebe três valores e retorna o maior
deles. Não use expressões condicionais e nem equações com guardas. Use a função
maximo2 do exercício 6.
35/38
Exercícios (cont.)
Exercício 9
Defina a função charToNum que converte um dígito decimal como ’8’ em seu valor
numérico, 8. O valor de caracteres que não são dígitos deve ser considerado como 0.
Exercício 10
Defina uma função chamada numRaizes que recebe os três coeficientes de uma
equação do segundo grau e retorna a quantidade de raízes reais distintas da equação.
Assuma que a equação é não degenerada (isto é, o coeficiente do termo de grau 2
não é zero).
36/38
Exercícios (cont.)
Exercício 11
Usando funções da biblioteca, defina a função halve :: [a] -> ([a],[a]) que
divide uma lista em duas metades. Por exemplo:
> halve [1,2,3,4,5,6]
([1,2,3],[4,5,6])
> halve [1,2,3,4,5]
([1,2],[3,4,5])
37/38
Exercícios (cont.)
Exercício 12
Determine o tipo da função definida a seguir e explique o que ela faz.
misterio m n p = not (m == n && n == p)
38/38
Fim
	Combinando funções
	Expressão condicional
	Definição de função com expressão condicional
	Equaçao com guardas

Outros materiais