Aula 4
livro texto (cap 8 Algebraic data types intro e Recursive data structures apenas)
1 Teste
escreva a funçao splitseq
que dado uma subsequencia pequena (o separador) e uma
sequencia (grande), usa o separador para quebrar a
sequencia grande em techos.
splitseq "abc" "123abc456abc890" ==> ["123","456","890"]
escreva o tipo de splitseq
(1 ponto)
se a funçao so faz o primeiro split (splitseq "abc" "123abc456abc890" ==> ["123","456abc890"]) o exercicio vale 2.5
se a funçao faz todos os splits, vale 3.0
No splitall da liçao de casa vc tinha algo como:
splitall t (x:xs) | x == t = faz also com o xs
o central desse problema (uma vez que vc ja implementou o splitall) é
que o teste se o separador é igual ao comeco da lista era simples no
caso de um unico separador (quebra a lista no 1 elemento e testa se
ele é igual ao separador) e se for, o que sobra da lista sem o
separador também é simples (o xs
).
no caso onde o separador é uma sequencia o teste se o separador é igual ao comeco, e computar o que sobra da lista sem o separador precisam ser re-escritos
2 lazy evaluation
[1..1000]
não cria uma lista de 1000 elementos, cria um objeto que
da um elemento por vez quando recebe o pedido, chamados thunk. A
vantagem é que isso nao aloca memoria para 1000 numeros
[7..]
é um thunk que gera 7, depois 8, depois 9, etc mas nao aloca
memoria para uma lista infinita
tudo em haskell sao thunks, promessas de computacao.
so na hora de print (no repl) é que a promessa é executada. Ha outros contextos que executam os thunks - strict (em oposicao a lazy)
let a = [1..] take 3 a let b = drop 5 a let {double [] = [] ; double (x:xs) = (2*x):(double xs)} let c = double b let d = double (take 1 c) d
3 Criando seus proprios tipos
data
data Ponto = Ponto Float Float -- x e y de um ponto data Figura = Circulo Ponto Float | Retangulo Ponto Ponto area (Circulo _ r) = 2 * 3.14 * r area (Retangulo (Ponto xa ya) (Ponto xb yb)) = abs ((ya-yb)*(xa-xb))
data Ponto = Ponto Float Float deriving (Eq,Read,Show)
Definicao de tipos pode conter variaveis de tipo
data Tree a = Vazia | No a (Tree a) (Tree a) deriving (Eq,Show,Read)
Isso define uma arvore binária de a
seja o que for a
4 Exercicios
- acha um item buma arvore de busca binaria
- verifica se uma arvore é um abb
- insere um item numa abb
- remove um item de uma abb
- calcula a profundidade maxima de uma abb
- coverte uma abb numa lista em ordem infixa (arvore-esquerda, no, arvore-direita)
- converte uma abb numa lista em ordem prefixa (no, ae, ad)
- converte uma lista em uma abb