listas lista estatica data-structures haskell functional-programming referential-transparency zipper

data structures - lista - Cremallera como estructura de datos con más de un cursor



lista estatica (2)

El trabajo de Oleg en cremalleras "concurrentes" a través de continuaciones delimitadas es la referencia principal.

La estructura de datos de Zipper es genial cuando uno quiere atravesar un árbol y mantener la posición actual, pero ¿qué estructura de datos se debe usar si se quiere rastrear más de una posición?

Déjame explicarte con ejemplos:

  • Alguien en el canal #haskell me ha dicho que las cremalleras se usan en el editor yi para representar la posición del cursor. Esto es genial, pero ¿y si quieres tener dos cursores? Como si quieres representar una selección, necesitas saber el principio y el final de la selección.
  • En el ejemplo de Minotauro en wikibooks, usan Zipper para representar la posición de Minotauro dentro del laberinto. Si quisiera agregar al enemigo al laberinto, representar su posición con una cremallera tendría mucho sentido.
  • El último es realmente de mi mini proyecto donde todo comenzó: como parte del aprendizaje de Haskell estoy tratando de visualizar una estructura de árbol usando cairo y gth2hs. Esto ha ido bien hasta ahora, pero ahora me gustaría seleccionar uno o más de los nodos y poder, por ejemplo, moverlos. Debido a que puede haber más de uno de los nodos seleccionados, no puedo usar Zipper tal como se define en los libros de texto.

Existe una solución trivial (¿ingenua?), Similar a la que habían usado en las primeras versiones de XMonad, que implica mapas finitos como se explica here .

Es decir, por ejemplo, en el caso de mi proyecto de ejemplo, almacenaría los nodos seleccionados en un mapa indexado y reemplazaría su representación en la estructura principal con los índices. Pero esta solución tiene muchas desventajas. Al igual que las que se explican en el enlace anterior, o decir, de nuevo en el caso de mi ejemplo, deseleccionar todos los nodos requeriría buscar todo el árbol.


Vea este papel . Me parece recordar haber leído en alguna parte que la segunda derivada tiene dos agujeros, que es probablemente lo que quieres.