Mein grundlegendes Verständnis der Linsenbildung is that, "ein Objektiv ist ein Wert, der Karten zwischen einem komplexen Typ und einem seiner Bestandteile darstellt. Diese Karte funktioniert in beide Richtungen - wir können den Bestandteil erhalten und" zugreifen " Setzen oder "mutieren" es "Scala: Lensing vs veränderbares Design
Ich stieß auf diese, als ich eine maschinelle Lernbibliothek (neuronale Netze) entwarf, die erfordert, eine große Datenstruktur von Parametern zu behalten, deren Gruppen in verschiedenen Stadien des Algorithmus aktualisiert werden müssen . Ich wollte die gesamte Parameterdatenstruktur unveränderlich erstellen, aber das Ändern einer einzelnen Parametergruppe erfordert das Kopieren aller Parameter und das Neuerstellen einer neuen Datenstruktur, was sich als ineffizient herausstellt. Nicht überraschend other peoplehave thought es auch. Einige Leute schlagen vor, Linsen zu verwenden, die in gewissem Sinne die Veränderung von unveränderlichen Datenstrukturen ermöglichen. Während andere Leute vorschlugen, nur Mutables für diese zu verwenden. Leider konnte ich nichts über den Vergleich dieser beiden Paradigmen, Geschwindigkeit, Raum, Code-Komplexität usw. finden.
Jetzt ist die Frage, was sind die Vor-/Nachteile der Verwendung von Objektiv vs vs-Design?
Danke für die nette Antwort. Eine Frage jedoch: Warum Objektivieren keine Probleme für Nebenläufigkeit schafft? (Wenn es mit Mutables vergleichbar ist, würde es Sinn ergeben, wenn es die gleichen Probleme mit Parallelität hat) – Daniel
Lensing ist immer noch unveränderlich, es erstellt nur eine API, die einer tiefen Mutation ähnelt. Wenn Sie einen "Satz" machen, hat jeder andere, der einen Verweis auf einen Teil der alten Struktur hat, immer noch den alten unmodifizierten Wert. Sie müssen das Ergebnis einer neuen Variablen in einem neuen Bereich zuweisen. –