Skiena sagte nicht „applicative Ordnung “, nur „applicative“. Dies wird manchmal als "rein funktional" oder als eine Sprache verwendet, die über die Anwendung von Funktionen im Gegensatz zur Ausführung von Zustandsmanipulationsbefehlen ausgewertet wird. Mathematica ist (zumindest heutzutage) nicht rein funktional, aber es scheint, dass es einen rein funktionalen Programmierstil stark fördert.
In einer rein funktionalen Sprache wie Haskell wenden Sie Funktionen auf Werte an und erzeugen neue Werte wie in der Mathematik. Wie in der Mathematik sind Variablen in einer solchen Sprache nur Namen für Werte. Wenn Sie sagen "lassenx Sein 1", dann x und 1sind überall austauschbar. Es macht keinen Sinn mehr, von "Mutieren" zu sprechen.x sein 2 als es zu sagen zu setzen 1 sein 2. Für ein Array bedeutet dies, dass Sie zum "Aktualisieren" eines Arrays ein neues Array mit den Änderungen erstellen. Das Erstellen einer vollständigen Kopie eines Arrays mit Ausnahme des einen Eintrags, den Sie ändern, ist natürlich teuer. Dies ist mit ziemlicher Sicherheit das Thema, auf das sich Skiena bezieht.
Meines Wissens gibt es keine völlig zufriedenstellende Antwort darauf. Das heißt, es gibt keine rein funktionale Datenstruktur, die eine konstante Zeitsuche und Aktualisierung aller Versionen ermöglicht . Sie können (extern) reine Datenstrukturen erstellen, die eine konstante Zeitsuche und Aktualisierung auf den neuesten Stand bringenVersionen, aber der Zugriff auf ältere Versionen des Arrays wird langsamer. Sie können Monaden oder Eindeutigkeitstypen verwenden, um die Verwendung von Arrays zu erzwingen, die es dem Compiler ermöglichen, direkte Aktualisierungen zu verwenden. Dies ist jedoch gleichbedeutend mit einem imperativen Ansatz (wenn auch auf kontrollierte und geschlossene Weise). In der Praxis verwenden Programmierer in rein funktionalen Sprachen Arrays nicht annähernd so häufig wie zwingende Programmierer, und wenn sie Arrays verwenden, verwenden sie in der Regel Massenoperationen. Wenn Sie ohnehin jedes Element eines Arrays berühren, sind die Kosten für das Kopieren des Arrays pro Element konstant.
Während es definitiv Zeiten gibt, in denen die Einschränkungen der rein funktionalen Programmierung eine effiziente Implementierung nicht offensichtlich machen, geht es meistens nur darum, andere Entwurfs- und Implementierungstechniken anzuwenden, als sie in imperativen Sprachen typisch / praktisch sind. Reinheit bietet auch Garantien, die viele Designs, Optimierungen und manchmal ganze Technologien praktisch machen. Zum einen sind die meisten rein funktionalen Datenstrukturen so konzipiert, dass sie so viel wie möglich gemeinsam nutzen. Zum zweiten ist die Fusion eine wichtige Technik zur Verbesserung der Leistung von Massenoperationen, bei der mehrere Massenoperationen zu einer kombiniert werden, um Zwischenprodukte zu vermeiden. Für das letzte,