Aula 3

livro texto capitulos: 2 (list comprehension) e 3

Haskell online

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 igualdade
  • Ord tem ordem (>)
  • Num tem as operacoes aritmeticas definicas

2.1 tipos basicos

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

Author: Jacques Wainer

Created: 2018-08-21 Tue 12:00

Validate