http://pesquisa.ufabc.edu.br/haskell/cursos/19.q3.eds_funcionais/
Universidade Federal do ABC
Emilio Francesquini
2019.Q3
Código e exercícios relativos ao segundo dia do curso.
- Slides
- Toda a explicação do código pode ser encontrada nos slides de aula.
Estes exercícios envolvem a alteração do código dado em aula. Uma suite de testes (parcial!) que testa apenas os casos 'happy day' foi fornecida. Para executá-la basta fazer stack test
no diretório raiz. Caso deseje, estenda a suite de testes com os seus próprios.
-
A função
nodes
recebe até 12 valores guardados em 2Digit
e umMaybe Digit
. Para simplificar a explicação do algoritmo, o código transforma osDigit
em listas e depois transforma o resultado[Digit]
(lista deDigit
) em um sóDigit
através de uma chamada à funçãodjoin
. Esta não é, contudo, a maneira mais simples de implementar o código. Aproveite o fato de que tantoDigit
quantoNode
seremFoldable
e reescreva a função para que não seja necessário transformar nem osDigit
de entrada em listas nem que seja utilizada a funçãodJoin
. Dica, use folds em conjunto com as funções auxiliares paraDigit
que utilizamos para implementar as views (talvez seja necessário criar funções semelhantes paraNode
). -
Considere a implementação de min-heap que fizemos utilizando Finger Trees.
a) A operação para localizar o elemento com a menor prioridade leva tempo O(lg n). Altere a implementação do Heap para que ele passe a levar O(1). Atenção, a implementação deve continuar sendo baseada em Finger Trees e a complexidade das demais operações deve continuar a ser O(lg n).
b) Implemente a operação de merge para o heaps com a seguinte assinatura:
heapMerge :: Heap a -> Heap a -> Heap a
. A função recebe dois heaps e devolve um heap que é a junção destes. -
A operação binária que devolve como resultado o segundo operando é associativa. Considerando essa operação e um elemento neutro
Nada
podemos definir:
data Valor a = Nada | UmValor a deriving (Eq, Ord, Show)
instance Semigroup (Valor a) where
v <> Nada = v
_ <> v = v
instance Monoid (Valor a) where
mempty = Nada
Considerando esse monoide e uma finger tree, implemente o tipo OrdSeq
que mantém uma lista ordenada. A sua implementação deve seguir o mesmo modelo utilizado para a implementação de Deques, Seq e Heap além de fornececer as seguintes funções:
partition x t
- devolve uma tupla contendo duasOrdSeq
. Uma contendo todos os elementos emt
à esqueda dex
(ou, de forma equivalente, < x) e outra com todos os elementos>=xs
.insert x t
- Recebe um elementox
e o insere naOrdSeq
t
mantendo a os elementos ordenados.deleteAll x t
- devolve umaOrdSeq
com todas as ocorrências dex
removidas.