Rein funktionelle Programmierung

Im Informatik, rein funktionelle Programmierung Normalerweise bezeichnet a Programmierparadigma- Ein Stil des Aufbaus der Struktur und Elemente von Computerprogrammen, die alle behandelt Berechnung als Bewertung von Mathematische Funktionen.

Programmstaat und veränderlich Objekte werden normalerweise mit modelliert zeitliche Logik, als explizite Variablen, die den Programmstatus bei jedem Schritt einer Programmausführung darstellen: Ein variabler Status wird als übergeben Eingabeparameter einer staatlich-transformierenden Funktion, die den aktualisierten Zustand als Teil seines Rücksendwerts zurückgibt. Dieser Stil behandelt Änderungsänderungen, ohne die zu verlieren Referenztransparenz der Programmausdrücke.

Eine rein funktionelle Programmierung besteht darin, sicherzustellen, dass die Funktionen innerhalb des funktional Paradigma wird nur von ihren Argumenten abhängen, unabhängig von einem globalen oder lokalen Staat. Eine reine funktionelle Unterroutine hat nur die Sichtbarkeit von Zustandsänderungen, die durch staatliche Variablen dargestellt werden, die in ihrem Bereich enthalten sind.

Unterschied zwischen reinem und unreinem funktionellen Programmieren

Der genaue Unterschied zwischen reinem und unreinem funktionellen Programmieren ist eine Frage der Kontroverse. Sabrys vorgeschlagene Definition von Reinheit ist, dass alle gemeinsam Bewertungsstrategien (Call-by-Namen, Call-by-Value und Call-by-Need) erzeugen das gleiche Ergebnis und ignorieren Strategien, die Fehler oder unterschiedlich sind.[1]

Ein Programm wird normalerweise als funktional bezeichnet, wenn es einige Konzepte von verwendet Funktionelle Programmierung, wie zum Beispiel erstklassige Funktionen und Funktionen höherer Ordnung.[2] Eine erstklassige Funktion muss jedoch nicht rein funktionsfähig sein, da sie Techniken aus dem verwenden kann Imperativ Paradigma wie z. Arrays oder Eingabe/Ausgabe Methoden Das verwenden veränderliche Zellen, die ihren Zustand als Nebenwirkungen aktualisieren. Tatsächlich sind die frühesten Programmiersprachen, die als funktional zitiert sind, IPL und Lispeln,[3][4] sind beide "unreine" funktionale Sprachen nach Sabrys Definition.

Rein funktionale Datenstrukturen sind hartnäckig. Für die funktionale Programmierung ist Persistenz erforderlich. Ohne sie könnte dieselbe Berechnung unterschiedliche Ergebnisse zurückgeben. Funktionelle Programmierung kann anhaltend nicht-poly funktional verwendet DatenstrukturenWährend diese Datenstrukturen möglicherweise nicht in rein funktionalen Programmen verwendet werden.

Eigenschaften rein funktionaler Programmierung

Strenge versus nicht strenge Bewertung

Jeder Bewertungsstrategie Das endet mit einem rein funktionalen Programm gibt das gleiche Ergebnis zurück. Insbesondere wird sichergestellt eifrige Bewertung wird das gleiche Ergebnis wie faule Bewertung. Es ist jedoch immer noch möglich, dass eine eifrige Bewertung nicht endet, während die faule Bewertung desselben Programms anhält. Ein Vorteil davon ist, dass eine faule Bewertung viel einfacher implementiert werden kann. Da alle Ausdrücke das gleiche Ergebnis jederzeit zurückgeben (unabhängig vom Programmzustand), kann sich ihre Bewertung so weit wie nötig verzögern.

Parallele Computing

Rein funktionelle Programmierung vereinfacht Parallele Computing[5] Da zwei rein funktionelle Teile der Bewertung niemals interagieren.

Datenstrukturen

Rein funktionell Datenstrukturen werden oft auf andere Weise dargestellt als ihre Imperativ Gegenstücke.[6] Zum Beispiel, Array Mit konstantem Zugriff und Update ist eine grundlegende Komponente der meisten imperativen Sprachen und vieler imperativen Datenstrukturen, wie z. Hash-tabelle und Binärhaufen, basieren auf Arrays. Arrays können durch ersetzt werden durch Karte oder Zufallszugriffsliste, die eine rein funktionale Implementierung zulässt, die Zugriffs- und Aktualisierungszeit jedoch ist logarithmisch. Daher können rein funktionale Datenstrukturen in nicht funktionsfähigen Sprachen verwendet werden, aber möglicherweise nicht das effizienteste verfügbare Werkzeug sind, insbesondere wenn keine Persistenz erforderlich ist.

Im Allgemeinen erfordert die Umwandlung eines imperativen Programms in ein rein funktionell Store-Passing-Stil.

Rein funktionale Sprache

Eine rein funktionale Sprache ist eine Sprache, die nur eine rein funktionale Programmierung zulässt. Rein funktionale Programme können jedoch in Sprachen geschrieben werden, die nicht rein funktionsfähig sind.

Verweise

  1. ^ Sabry, AMR (Januar 1993). "Was ist eine rein funktionale Sprache?". Journal of Functional Programming. 8 (1): 1–22. Citeseerx 10.1.1.27.7800. doi:10.1017/s0956796897002943.
  2. ^ Atencio, Luis (18. Juni 2016). Funktionelle Programmierung in JavaScript. Manning Publikationen. ISBN 978-1617292828.
  3. ^ Die Memoiren von Herbert A. Simon (1991),, Models meines Lebens S. 189-190 ISBN0-465-04640-1 behauptet, dass er, Al Newell und Cliff Shaw "allgemein als Eltern der künstlichen Intelligenz [Feld] für das Schreiben bezeichnet werden." Logikheoretiker, ein Programm, das die Theoreme ausgewiesen hat Principia Mathematica automatisch. Um dies zu erreichen, mussten sie eine Sprache und ein Paradigma erfinden, das, das sich nachträglich ansah, funktionelle Programme einbettete.
  4. ^ McCarthy, John (Juni 1978). "Geschichte von Lisp" ". In ACM Sigplan History of Programming Languages ​​Conference: 217–223. doi:10.1145/800025.808387.
  5. ^ Marlow, Simon (18. Juni 2013). Parallele und gleichzeitige Programmierung in Haskell: Techniken für Multicore- und Multithread -Programmierung. O'Reilly Media. ISBN 978-1449335946.
  6. ^ Rein funktionale Datenstrukturen durch Chris Okasaki, Cambridge University Press, 1998, ISBN0-521-66350-4