Aula 3
livro texto capitulos: 2 (list comprehension) e 3
1 List Comprehension
[ f x | x <- lista , condicao1 x, condicao2 x]
[ x+10 | x <- [1..10], x `mod` 2 == 0]
somapares xs = soma [x | x <- xs, x `mod` 2 == 0] removeAll c lista = [y | y <- lista, y /= c] trocaAll velho novo lista = [ if y == velho then novo else y | y <- lista]
2 Por que aprender Haskell!!
qs [] = [] qs (x:xs) = qs menores ++ [x] ++ qs maiores where menores = [y | y <- xs, y<=x] maiores = [y | y <- xs, y>x]
3 Tipos
:t head head :: [a] -> a
indica uma funçao que recebe uma lista de valores do tipo a
e
retorna um valor do tipo a
a
é uma variavel de tipo (type variable)
removeAll c lista = [y | y < lista, y /= c] :t removeAll removeAll :: Eq t => t -> [t] -> [t]
a parte "t -> [t] -> [t]
" indica que é uma função de 2 argumentos, um
dado e uma lista de dados, que retorna uma lista de dados (porque os 2
argumentos são separados por uma flecha fica para outra aula -
currying)
"Eq t ==>
" indica que o tipo t
tem restricoes, e tem que pertencer
ao typeclass Eq
que sao tipos para os quais a comparacao de
igualdade esta definida (quase todos mas não funções!!)
Eq
tem igualdadeOrd
tem ordem (>
)Num
tem as operacoes aritméticas (+, -, * eabs
) definidas .Num
é parte doEq
mas não doOrd
(números complexos!!) Divisão nao esta incluida nosNum
Show
pode ser impresso ( convertido para string) - funçãoshow
Read
pode ser lido (de um string) - funçãoread
Quando voce definir seus tipos, voce podera definir o que ==
(Eq
)
singnifica para o seu tipo, da mesma forma o show
, read
, <
etc
3.1 tipos basicos
Int
inteiros de maquinaInteger
inteiros sem limite de tamanhoFloat
do CDouble
do CBool
booleanoChar
caracter
3.2 outros tipos genéricos
Integral
generico de inteiros e operação de divisão inteira e restoFractional
generico para floats e operaçao de divisão realFloating
generico para floats e operações exponencias, trigonométricas, etc
3.3 Definindo o tipo na declaracao da variavel
ordenada :: Ord a => [a] -> Bool ordenada [] = True ordenada [x] = True ordenada (a:b:xs) | a <= b = ordenada (b:xs) | otherwise = False -- ou ordenada (a:b:xs) = a<-b && ordenada (b:xs)
troca1 _ _ [] = [] troca1 n v (x:xs) | x == v = n ++ (troca1 n v xs) | otherwise = x ++ (troca1 n v xs) troca1 8 9 [2,4,5,8,7,6,8,7]
trocaAll :: Eq a => a -> a -> [a] -> [a] trocaAll velho novo lista = [ if y == velho then novo else y | y <- lista]
4 Booleanos
True
False
||
or&&
and
membro x [] = False membro x (a:as) | x == a = True | otherwise = membro x as membro x [] = False membro x (a:as) = x==a || membro x as 4 `membro` [ 3,2,4,5,6,4,3,2,1]
5 Exercicios
refaça os exercicios da aula passada usando variaveis locais, recursao com acumulador, list comprehension, funcoes retornando tuplas, combinando funçoes ja implementadas, etc se for o caso. Em particular tente usar acumuladores para aprender apensar dessa forma.
Fazer os exercícios abaixo usando apenas head
tail
:
++
- posicoes - dado um item e uma lista, retorna uma lista com todas as posicoes (primeiro elemento esta na posicao 1) do item na lista
- split - dado um item e uma lista retorna uma lista de listas, todos os elementos da lista antes do item (a primeira vez que ele aparece) e todos depois
split "qwertyuiopoiuyt" 't' ==> ["qwer", "yuiopoiuyt"]
- splitall - mesma coisa que o split mas retorna todas as sublistas
splitall "qwertyuiopoiuytxxt" 't' ==> ["qwer", "yuiopoiuy", "xx", ""] ou ["qwer", "yuiopoiuy", "xx"]
- drop n lista - a lista sem os n primeiros elementos
- take n lista - os primeiros n elementos da lista