Ich schreibe einen grafischen Editor für ein "Modell" (dh eine Sammlung von Boxen und Zeilen mit irgendeiner Art von Semantik, wie UML, deren Details hier keine Rolle spielen) . Ich möchte also eine Datenstruktur, die das Modell darstellt, und ein Diagramm, bei dem eine Bearbeitung des Diagramms eine entsprechende Änderung im Modell bewirkt. Wenn zum Beispiel ein Modellelement einen Text in einem Attribut hat und ich den Text im Diagramm bearbeite, möchte ich, dass das Modellelement aktualisiert wird.Zipper Datenstruktur für grafischen Modell Editor
Das Modell wird wahrscheinlich als Baum dargestellt, aber ich möchte, dass der Diagrammeditor so wenig wie möglich über die Modelldarstellung weiß. (Ich verwende das diagrams Framework, so dass die Zuordnung beliebiger Informationen zu einem grafischen Element einfach ist). Es wird wahrscheinlich eine "Modell" -Klasse geben, um die Schnittstelle zu kodieren, wenn ich nur herausfinden kann, was das sein soll.
Wenn ich dies in einer imperativen Sprache tun würde, wäre es einfach: Ich hätte nur eine Referenz vom grafischen Element im Diagramm zurück zum Modellelement. Theoretisch könnte ich das immer noch tun, indem ich das Modell aus einer riesigen Sammlung von IORefs aufbaute, aber das würde ein Java-Programm in Haskell schreiben.
Offensichtlich wird jedem graphischen Element eine Art Cookie zugeordnet, die die Aktualisierung des Modells ermöglicht. Eine einfache Antwort wäre, jedem Modellelement einen eindeutigen Bezeichner zu geben und das Modell in einer Data.Map-Nachschlagetabelle zu speichern. Dies erfordert jedoch eine signifikante Buchführung, um sicherzustellen, dass keine zwei Modellelemente die gleiche Kennung erhalten. Es erscheint mir auch als eine "stringly typed" Lösung; Sie müssen Fälle behandeln, in denen ein Objekt gelöscht wird, aber an anderen Stellen gibt es einen baumelnden Verweis darauf, und es ist schwierig, etwas über die interne Struktur des Modells in Ihren Typen zu sagen.
Auf der anderen Seite Oleg's writings über Reißverschlüsse mit mehreren Löchern und Cursor mit klaren transaktionalen Teilen klingt wie eine bessere Option, wenn ich es nur verstehen könnte. Ich bekomme die Grundidee von List- und Tree-Zippern und der Differenzierung einer Datenstruktur. Wäre es möglich, dass jedes Element in einem Diagramm einen Cursor in einen Reißverschluss des Modells hält? Wenn also eine Änderung vorgenommen wird, kann sie dann allen anderen Cursorn übergeben werden. Einschließlich Baumoperationen (z. B. Verschieben einer Teilstruktur von einem Ort zu einem anderen)?
Es würde mir an dieser Stelle besonders helfen, wenn es eine Art Tutorial über abgegrenzte Fortsetzungen gäbe, und eine Erklärung, wie Olegs Multi-Cursor-Reißverschlüsse arbeiten, die etwas weniger steil sind als Olegs Beiträge?
Vielleicht Chung-chieh Shans Blog? : http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WalkZip1/. Beachten Sie, Blobs (wxHaskell) ist eine Bibliothek zum Schreiben von "Netzwerk-Editoren" - es hat wahrscheinlich etwas verrottet, aber es kann weniger Arbeit sein, es zu aktualisieren als neu mit Diagrammen zu beginnen. –
Danke. Ich habe angefangen, damit zu arbeiten. Ich werde dich wissen lassen, ob es zu einer Antwort führt. –