Aula 3
livro texto capitulos: 2 (list comprehension) e 3
1 List Comprehension
[ 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]
2 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 -
curriying)
"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 nao funcoes!!)
Eq
tem igualdadeOrd
tem ordem (>
)Num
tem as operacoes aritmeticas definicas
2.1 tipos basicos
Int
inteiros de maquinaInteger
inteiros sem limite de tamanhoFloat
do CDouble
do CBool
booleanoChar
caracter
2.2 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)
t1 _ _ [] = [] t1 n v (x:xs) | x == v = n ++ (t1 n v xs) | otherwise = x ++ (t1 n v xs) t1 8 9 [2,4,5,8,7,6]
t2 :: Eq a => a -> a -> [a] -> [a] t2 _ _ [] = [] t2 n v (x:xs) | x == v = n ++ (t2 n v xs) | otherwise = x ++ (t2 n v xs)
3 Exercicios
refaça os exercicios da aula passada usando variaveis locias, 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