Datensatz wird aktualisiert, wenn von mehreren Datenstrukturen auf ihn verwiesen wird

Angenommen, ich habe eine Aufzeichnung, z.Person, und ich möchte in der Lage sein, diese Person durch mehrere Datenstrukturen nachzuschlagen. Möglicherweise gibt es einen Index nach Namen, einen weiteren Index nach der Postleitzahl der Person und einen weiteren Index nach dem aktuellen Breiten- und Längengrad der Person. Und vielleicht noch viel mehr Datenstrukturen. All das existiert, weil ich eine Person oder Personen mit unterschiedlichen Kriterien effizient nachschlagen muss.

Wenn ich nur musslesen die eigenschaften einer person,Dies ist kein Problem. Angenommen, ich muss eine Person suchen, die eine dieser Datenstrukturen verwendet, und dannaktualisieren die Daten der Person.

In einer OOP-Sprache würde jede Datenstruktur auf dieselbe Person im Speicher verweisen. Wenn Sie also eine aktualisieren, aktualisieren Sie implizit auch die Referenzen der anderen Datenstrukturen. Dies ist so ziemlich die Definition von Nebenwirkungen und Unreinheit. Ich weiß, dass es dem Haskell-Paradigma völlig widerspricht, und ich erwarte nicht, dass Haskell so arbeitet.

Also, wie geht das nach Haskell? Um es klar auszudrücken, das Problem ist folgendes: Ich suche eine Person anhand einer Datenstruktur und übergebe diese Person (und möglicherweise einige andere willkürliche Daten) in eine Funktion des TypsArbitraryData -> Person -> Person. Wie verbreite ich diese Änderung auf alle verschiedenen Nachschlagestrukturen?

Als relativer Neuling in Haskell besteht mein erster Instinkt darin, jedes Mal, wenn ich eine Person aktualisiere, jede Suchstruktur mit der neu aktualisierten Person zu rekonstruieren. Aber das scheint eine Menge Zeremonien zu sein, mit viel Gelegenheit für mich, es auf eine Weise zu vermasseln, die GHC nicht erkennen kann und die überhaupt nicht elegant ist. Haskell ist bekannt für seine Eleganz, und ich kann mir nicht vorstellen, dass es keine elegante Lösung für solch ein allgemeines und grundlegendes Problem gibt. Ich glaube, ich vermisse etwas.

Als Referenz wird diese Frage auf einige der Themen erweitert, die ich in den folgenden Fragen erörtert habe:

Mehrere Suchstrukturen für dieselben Daten: Speicherduplizierung?

Identität von Simulationsobjekten in Haskell

Bearbeiten

Eine Lösung, die mir gerade in den Sinn gekommen ist: Behalten Sie keine Kopie jeder Suchstruktur in Ihrem Hauptstatus bei. Führen Sie einfach eine einzige Liste aller vorhandenen Personen, und das ist das einzige, was wir aktualisieren müssen, wenn wir eine Person aktualisieren. Übergeben Sie jedes Mal, wenn Sie beispielsweise nach der Postleitzahl suchen müssen, die Liste aller Personen an eine Funktion, die die effiziente Datenstruktur nach Postleitzahl generiert. Führen Sie dann die Suche nach dem Ergebnis durch.

Ich weiß nicht, ob das effizient wäre. Wenn dies dazu führt, dass die CPU die Suchstruktur bei jeder Verwendung neu berechnet, ist dies nicht akzeptabel. Aber ich weiß, dass Haskell es manchmal vermeiden kann, identische Ausdrücke neu zu bewerten. Leider habe ich immer noch nicht herausgefundenwann das ist der Fall. Ich weiß also nicht, ob dieser Ansatz durchführbar ist.

Also mit anderen Worten: Kann ich meine Funktionen schreibenals ob Sie berechnen die Suche jedes Mal, wenn GHC sie tatsächlich für Fälle optimiert, in denen sich die zugrunde liegenden Daten nicht geändert haben. Denn das wäre einsehr elegante Lösung für das Problem, das ich oben identifiziert habe.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage