Aula 18
1 pattern matching
funcoes em haskell podem ser escritas como diferentes "regras" com pattern matching como no Prolog
fatorial 0 = 1 fatorial x = x * fatorial (x-1)
2 pattern matchin para listas
A lista [1,2,3,9]
pode ser representada como
1:[2,3,9]
mas a lista vazia não pode
soma [] = 0 soma (x:xs) = x + soma xs
O parenteses no argumento da segunda regra é necessario pois o :
tem menor precedencia que o branco
pattern matching funciona para tuplas, e o _
tambem é uma variavel anonima
primo (a,_,_) = a segundo (_,x,_) = x
3 Guards
bmiTell weight height | weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!" | weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!" | weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!"
4 let
let: define variaveis e funcoes locais ANTES da expressao final
cylinder r h = let sideArea = 2 * pi * r * h topArea = pi * r ^2 in sideArea + 2 * topArea
5 where
where define variaveis e funcoes locais depois da expressao final
cylinder r h = sideArea + 2 * topArea where sideArea = 2 * pi * r * h topArea = pi * r ^2
soma x = soma' x 0 where soma' [] s = s soma' (x:xs) s = soma' xs (x+s)
bmiTell weight height | aux <= 18.5 = "You're underweight, you emo, you!" | aux <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!" | aux <= 30.0 = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!" where aux = weight / height ^ 2
6 range
[2..10] [2,5..30] [10..2] - nao funciona [10,9..2] - funciona
7 List Comprehension
[x**2 | x <- [1..10]] [3*x | x <- [1,4..30], odd x] [3*x | x <- [1,4..30], odd x, x>12] [ x+y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
8 exercicios
Se possivel faça as 2 versoes (com e sem acumulador) de cada um desses exercicios
SEM USAR as funcoes pre-definidas do haskell a nao ser ++
que é a concatenacao de listas
- maior elemento de uma lista
- ultimo elemento de uma lista
ultimo [x] = x ultimo (_:xs) = ultimo xs
- lista sem o ultimo elemento
- apenas os elementos nas posicoes 1, 3. 5 etc da lista
posimpar [] = [] posimpar [a] = [a] posimpar (a:b:resto) = a : posimpar resto
- apenas os elementos positivos de uma lista de numeros
sopos l = [x | x<-l, x>0]
- a soma dos elementos positivos de uma lista de numeros
- retorna True se a lista estiver ordenada crescentemente
- shift right (1 2 3 4) -> (4 1 2 3)
- shift left (1 2 3 4) -> (2 3 4 1)
- revere uma lista (1 2 3 4) -> (4 3 2 1)
- conta quantas vezes um item aparece numa lista (conta item lista) (0 caso nao apareça)
- em que posição um item aparece numa lista (-1 se nao aparece)
- (remove item list) retorna a lista sem o item - em todas as vezes que ele aparece
- (replace item novo lista) retorna lista onde todos os items foram trocado por novo