Viele moderne Programmiersprachen unterstützen ein Konzept des Schließens , dh eines Codes (eines Blocks oder einer Funktion)
- Kann als Wert behandelt und daher in einer Variablen gespeichert, an verschiedene Teile des Codes weitergegeben, in einem Teil eines Programms definiert und in einem völlig anderen Teil desselben Programms aufgerufen werden.
- Kann Variablen aus dem Kontext erfassen, in dem sie definiert sind, und auf sie zugreifen, wenn sie später aufgerufen werden (möglicherweise in einem völlig anderen Kontext).
Hier ist ein Beispiel für einen Abschluss in Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Das Funktionsliteral x => x >= lowerBound
enthält die freie Variable lowerBound
, die durch das Argument der gleichnamigen Funktion geschlossen (gebunden) wird filterList
. Der Abschluss wird an die Bibliotheksmethode übergeben filter
, die ihn als normale Funktion wiederholt aufrufen kann.
Ich habe auf dieser Website viele Fragen und Antworten gelesen, und soweit ich weiß, wird der Begriff Abschluss häufig automatisch mit funktionaler Programmierung und funktionalem Programmierstil assoziiert .
Die Definition der Funktionsprogrammierung auf Wikipedia lautet:
In der Informatik ist die funktionale Programmierung ein Programmierparadigma, das die Berechnung als Bewertung mathematischer Funktionen behandelt und Zustands- und veränderbare Daten vermeidet. Es betont die Anwendung von Funktionen im Gegensatz zum imperativen Programmierstil, der Zustandsänderungen betont.
und weiter
[...] im Funktionscode hängt der Ausgabewert einer Funktion nur von den Argumenten ab, die in die Funktion [...] eingegeben werden. Die Beseitigung von Nebenwirkungen kann das Verständnis und die Vorhersage des Verhaltens eines Programms erheblich erleichtern. Dies ist eine der Hauptmotive für die Entwicklung der funktionalen Programmierung.
Andererseits ermöglichen viele von Programmiersprachen bereitgestellte Abschlusskonstrukte, dass ein Abschluss nicht lokale Variablen erfasst und beim Aufruf des Abschlusses ändert, wodurch ein Nebeneffekt auf die Umgebung erzeugt wird, in der sie definiert wurden.
In diesem Fall implementieren Verschlüsse die erste Idee der funktionalen Programmierung (Funktionen sind erstklassige Entitäten, die wie andere Werte verschoben werden können), vernachlässigen jedoch die zweite Idee (Vermeidung von Nebenwirkungen).
Wird diese Verwendung von Verschlüssen mit Nebenwirkungen als funktionaler Stil betrachtet oder werden Verschlüsse als allgemeineres Konstrukt betrachtet, das sowohl für einen funktionalen als auch für einen nicht funktionalen Programmierstil verwendet werden kann? Gibt es Literatur zu diesem Thema?
WICHTIGE NOTIZ
Ich bezweifle nicht die Nützlichkeit von Nebenwirkungen oder Verschlüssen mit Nebenwirkungen. Ich bin auch nicht an einer Diskussion über die Vor- und Nachteile von Verschlüssen mit oder ohne Nebenwirkungen interessiert.
Ich bin nur daran interessiert zu wissen, ob die Verwendung solcher Verschlüsse vom Befürworter der funktionalen Programmierung immer noch als funktionaler Stil angesehen wird oder ob im Gegenteil von ihrer Verwendung bei Verwendung eines funktionalen Stils abgeraten wird.