Zipper

Zipper

Difícil

Instruções

Criando um zipper para uma árvore binária.

Os zippers são uma maneira puramente funcional de navegar dentro de uma estrutura de dados e de manipulá-la. Essencialmente, eles contêm uma estrutura de dados e um ponteiro para dentro dessa estrutura de dados (chamado de foco).

Por exemplo, dada uma rose tree (em que cada nó contém um valor e uma lista de nós filhos), um zipper pode dar suporte a estas operações:

  • from_tree (obtém um zipper a partir de uma rose tree, o foco fica no nó raiz)
  • to_tree (obtém a rose tree de volta a partir do zipper)
  • value (obtém o valor do nó em foco)
  • prev (move o foco para o filho anterior do mesmo pai, retorna um novo zipper)
  • next (move o foco para o próximo filho do mesmo pai, retorna um novo zipper)
  • up (move o foco para o pai, retorna um novo zipper)
  • set_value (define o valor do nó em foco, retorna um novo zipper)
  • insert_before (insere uma nova subárvore antes do nó em foco, ela passa a ser o prev do nó em foco, retorna um novo zipper)
  • insert_after (insere uma nova subárvore depois do nó em foco, ela passa a ser o next do nó em foco, retorna um novo zipper)
  • delete (remove o nó em foco e todas as subárvores, o foco vai para o nó next se possível, caso contrário para o nó prev se possível, caso contrário para o nó pai, retorna um novo zipper)
Editar via GitHub O link abre em uma nova janela ou aba
Haskell Exercism

Tudo pronto para começar Zipper?

Crie sua conta no Exercism para aprender e dominar Haskell com 107 exercícios e mentoria humana de verdade, tudo de graça.