Das ist ein interessantes Konzept. Eine Hauptkomplikation bei einer "rein funktionalen" Einstellung wäre, dass die Objektidentität normalerweise nicht in einem "rein funktionalen" Sinn wahrnehmbar ist. Wenn ich beispielsweise ein Objekt kopiere oder ein neues identisches Objekt erstelle, wird in Java erwartet, dass der Klon nicht das Original ist. Aber in einer funktionalen Umgebung wird erwartet, dass die neue semantisch identisch mit der alten ist, obwohl der Garbage Collector sie anders behandelt.
Also, wenn wir zulassen, dass Objektidentität ein Teil der Semantik ist, wäre es Ton, sonst wahrscheinlich nicht. In letzterem Fall, selbst wenn ein Hack gefunden werden könnte (ich dachte an einen, der unten beschrieben wird), wird es wahrscheinlich sein, dass die Sprachimplementierung Sie überall hin bekämpfen wird, weil er alle möglichen Dinge tun wird, um diese Tatsache auszunutzen Diese Objektidentität soll nicht beobachtbar sein.
Ein 'Hack', der mir in den Sinn kam, wäre die Verwendung von Unique-by-Construction-Werten als Schlüssel, so dass die Wertgleichheit größtenteils mit der Referenzgleichheit übereinstimmt. Zum Beispiel habe ich eine Bibliothek, die ich persönlich mit der folgenden in ihrer Schnittstelle in Haskell verwenden:
data Uniq s
getUniq :: IO (Uniq RealWorld)
instance Eq (Uniq s)
instance Ord (Uniq s)
Eine Hash-Karte wie Sie beschreiben, würde wahrscheinlich meist Arbeit mit diesen als Schlüssel, aber auch hier kann ich von einem denken So könnte es brechen: Angenommen, ein Benutzer speichert einen Schlüssel in einem strikten Feld einer Datenstruktur, wobei die Optimierung der "Unbox-Strict-Fields" -Funktion des Compilers aktiviert ist. Wenn "Uniq" nur ein Wrapper vom Typ newtyp zu einer Maschinen-Ganzzahl ist, ist möglicherweise kein Objekt mehr vorhanden, auf das der GC zeigen und sagen kann "das ist der Schlüssel". Wenn der Benutzer seinen Schlüssel auspackt und ihn dann auspackt, kann die Karte dies bereits vergessen haben.(Edit: Dieses spezielle Beispiel kann offensichtlich umgangen werden; machen Uniqs Implementierung zu etwas, das so nicht entkoppelt werden kann; der Punkt ist nur, dass es schwierig ist, gerade weil der Compiler versucht, in vielerlei Hinsicht hilfreich zu sein erwarten)
TL; DR: Ich würde nicht sagen, dass es nicht getan werden kann, aber ich vermute, dass "Optimierungen" in vielen Fällen entweder brechen oder durch eine schwache Hash-Map-Implementierung gebrochen werden, sofern Objekt-Identität gegeben ist erstklassiger beobachtbarer Status
Nicht ganz. Der springende Punkt einer schwachen Hash-Map ist, dass der GC nicht erreichbare Subgraphen automatisch freigibt, ohne dass der Programmierer dies regelmäßig anfordern muss. –
Ich sage ausdrücklich, dass das nicht mit einer persistenten Datenstruktur funktionieren kann und eine Möglichkeit bietet, die beiden Verhaltensweisen in Einklang zu bringen. Dein Problem ist, dass du denkst, ich kann es nicht erreichen, aber ich kann es. Ich habe keinen Bezug zum Objekt (natürlich), aber ich habe einen Schlüssel. –
Ihre Interpretation des Verhaltens ist falsch. Bindungen in einer schwachen Hash-Map werden entfernt, wenn der * Schlüssel * nicht mehr erreichbar ist. Sie haben den Schlüssel in Ihrem Gegenbeispiel festgehalten, so dass die Bindung für diesen Schlüssel nicht gesammelt werden konnte und es kein Problem gibt. Die Erreichbarkeit von "o" ist irrelevant. Ich sehe keinen Grund, warum dies nicht auch mit persistenten Datenstrukturen funktionieren könnte, da es nur die Semantik unerreichbarer Werte betrifft, die definitionsgemäß nicht beobachtbar sind. –