Einer der Grundsätze der funktionalen Programmierung ist die Verwendung von reinen Funktionen. Eine Pure-Funktion ist nebenwirkungsfrei und referenziell transparent.
Getter sind nicht referentiell transparent - wenn ein Setter zwischen dem Aufruf der Getter, die Getter Rückgabewert ändert , auch wenn seine Parameter nicht ( in der Regel keine Parameter) aufgerufen wird
Setter verursachen Nebenwirkungen - Das Aufrufen eines Setters manipuliert normalerweise einen Wert, der nicht der Rückgabewert ist (tatsächlich gibt ein Setter traditionell nichts zurück).
Ich weiß, dass wir in Scala die Tatsache akzeptieren, dass wir zwei Paradigmen (funktional und objektorientiert) miteinander verbinden und Getter / Setter verwenden, wie wir es in einer Sprache wie Java tun würden.
In einer Sprache wie Haskell (die ich nicht fließend beherrsche, aber mir wurde gesagt, dass sie einer "reinen" Funktionssprache besser entspricht) bin ich nur neugierig, wie Sie Eigenschaften auf Objekten modellieren würden, bei denen Getters referenziell transparent und Setter sind sind Nebenwirkungen frei?
Wäre die Lösung, eine Kopie des Objekts, für das der Setter aufgerufen wurde, als Rückgabewert des Setters zurückzugeben, und diese Kopie enthält die Änderung des Eigenschaftswerts?
quelle
Antworten:
Genau. Siehe Fallklassenmethode
copy
oder das allgemeine Konzept von Objektiven.Insbesondere wenn der Status geändert werden muss, verwenden Sie eine Statusmonade. Änderungen an dieser Zustandsmonade können durch Linsen vorgenommen werden, was das Extrahieren von Informationen aus dem "Zustand" und das Ändern dieser Informationen erleichtert.
Siehe auch diese Frage zum allgemeinen Problem, das von einer tiefen Struktur wie "Zustand" herrührt und Änderungen daran vornimmt. Die Antworten haben gute Links sowohl zu Objektiven als auch zu Reißverschlüssen, wenn Sie näher darauf eingehen möchten.
quelle
Nun, in Haskell, Objekte sind ( in der Regel) unveränderlich, so Getter (die Sie erhalten , wenn Sie Datensatz Syntax verwenden) oder Funktionen , die wirken wie Getter sind referentiell transparent. Und dann "setzen" Sie keine Werte für Objekte - wenn überhaupt, erstellen Sie ein neues Objekt, das dem alten ähnlich ist, aber einen anderen Wert für eines der Felder hat. Dies ist auch eine reine Funktion.
quelle
"Getter und Setter haben das Objekt als Parameter - obwohl es normalerweise implizit ist - so dass Getter referenziell transparent sind. - delnan"
Referenziell transparent bedeutet, dass die Funktion IMMER dieselbe Ausgabe für dieselben Eingaben zurückgibt. Wenn also ein Objektattribut von einem Setter geändert wurde, geben Sie nicht dieselbe Ausgabe zurück. :) :)
quelle