Aula 3

livro texto capitulos: 2 (list comprehension) e 3

Haskell online

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 igualdade
  • Ord tem ordem (>)
  • Num tem as operacoes aritméticas (+, -, * e abs) definidas . Num é parte do Eq mas não do Ord (números complexos!!) Divisão nao esta incluida nos Num
  • Show pode ser impresso ( convertido para string) - função show
  • Read pode ser lido (de um string) - função read

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 maquina
  • Integer inteiros sem limite de tamanho
  • Float do C
  • Double do C
  • Bool booleano
  • Char caracter

3.2 outros tipos genéricos

  • Integral generico de inteiros e operação de divisão inteira e resto
  • Fractional generico para floats e operaçao de divisão real
  • Floating 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