Aula 4

livro texto (cap 8 Algebraic data types intro e Recursive data structures apenas)

Haskell online

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

Author: Jacques Wainer

Created: 2018-08-23 Thu 14:32

Validate