Crear un zipper para un árbol binario.
Los zippers son una forma puramente funcional de navegar dentro de una estructura de datos y manipularla. Esencialmente contienen una estructura de datos y un puntero dentro de esa estructura de datos (llamado el foco).
Por ejemplo, dado un árbol rosa (donde cada nodo contiene un valor y una lista de nodos hijos), un zipper podría soportar estas operaciones:
from_tree (obtener un zipper a partir de un árbol rosa, el foco está en el nodo raíz)to_tree (obtener el árbol rosa a partir del zipper)value (obtener el valor del nodo del foco)prev (mover el foco al hijo anterior del mismo padre,
devuelve un nuevo zipper)next (mover el foco al siguiente hijo del mismo padre, devuelve un
nuevo zipper)up (mover el foco al nodo padre, devuelve un nuevo zipper)set_value (asignar el valor del nodo del foco, devuelve un nuevo zipper)insert_before (insertar un nuevo subárbol antes del nodo del foco, se
convierte en el prev del nodo del foco, devuelve un nuevo zipper)insert_after (insertar un nuevo subárbol después del nodo del foco, se convierte
en el next del nodo del foco, devuelve un nuevo zipper)delete (elimina el nodo del foco y todos los subárboles, el foco se mueve al
nodo next si es posible, de lo contrario al nodo prev si es posible,
de lo contrario al nodo padre, devuelve un nuevo zipper)Regístrate en Exercism para aprender y dominar Haskell con 107 ejercicios y mentoría humana real, todo gratis.