Rein funktionale Programmierung - Purely functional programming

In der Informatik bezeichnet die rein funktionale Programmierung normalerweise ein Programmierparadigma – einen Baustil für die Struktur und Elemente von Computerprogrammen –, das alle Berechnungen als die Bewertung mathematischer Funktionen behandelt . Rein funktionale Programmierung kann auch durch das Verbot von Zustandsänderungen und veränderlichen Daten definiert werden.

Rein funktionale Programmierung besteht darin, sicherzustellen, dass Funktionen innerhalb des funktionalen Paradigmas unabhängig von einem globalen oder lokalen Zustand nur von ihren Argumenten abhängen.

Unterschied zwischen reiner und unreiner funktionaler Programmierung

Der genaue Unterschied zwischen reiner und unreiner funktionaler Programmierung ist umstritten.

Ein Programm wird normalerweise als funktional bezeichnet, wenn es einige Konzepte der funktionalen Programmierung verwendet , wie beispielsweise erstklassige Funktionen und Funktionen höherer Ordnung . Jedoch ist ein erstklassiges braucht nicht rein funktional sein, da es Techniken , die aus der Verwendung kann zwingend notwendig Paradigma, wie Arrays oder Eingabe / Ausgabe - Verfahren , die nicht rein funktionalen Programme sind. Tatsächlich waren die frühesten als funktional bezeichneten Programmiersprachen, IPL und Lisp , beide nach der aktuellen Definition "unreine" funktionale Sprachen.

Rein funktionale Datenstrukturen sind persistent . Für die funktionale Programmierung ist Persistenz erforderlich; ohne sie könnte dieselbe Berechnung unterschiedliche Ergebnisse liefern. Funktionale Programmierung kann dauerhafte nicht-rein funktionale Datenstrukturen verwenden , während diese Datenstrukturen in rein funktionalen Programmen nicht verwendet werden können.

Eigenschaften der rein funktionalen Programmierung

Strenge versus nicht-strenge Bewertung

Jede Auswertestrategie, die auf einem rein funktionalen Programm endet, liefert das gleiche Ergebnis. Insbesondere stellt es sicher, dass der Programmierer nicht berücksichtigen muss, in welcher Reihenfolge Programme evaluiert werden, da Eager Evaluation das gleiche Ergebnis liefert wie Lazy Evaluation . Es ist jedoch immer noch möglich, dass eine Eager-Evaluierung nicht beendet wird, während die Lazy-Evaluation desselben Programms anhält. Dies hat den Vorteil, dass die Lazy-Evaluation viel einfacher implementiert werden kann; Da alle Ausdrücke zu jedem Zeitpunkt (unabhängig vom Programmstatus) das gleiche Ergebnis liefern, kann ihre Auswertung so lange wie nötig verzögert werden.

Paralleles Rechnen

Rein funktionale Programmierung vereinfacht das parallele Rechnen, da zwei rein funktionale Teile der Auswertung niemals interagieren.

Datenstrukturen

Rein funktionale Datenstrukturen werden oft anders dargestellt als ihre zwingenden Pendants. Zum Beispiel Array mit konstantem Zeitzugriff und Aktualisieren eine Grundkomponente der meisten imperativen Sprachen und viele zwingend notwendig , Daten-Strukturen, wie beispielsweise ist Hashtabelle und binary heap , basiert auf Arrays. Arrays können durch Map oder Random Access List ersetzt werden , was eine rein funktionale Implementierung zulässt, aber die Zugriffs- und Aktualisierungszeit ist logarithmisch . Daher können rein funktionale Datenstrukturen in Sprachen verwendet werden, die nicht funktional sind, aber sie sind möglicherweise nicht das effizienteste verfügbare Werkzeug, insbesondere wenn keine Persistenz erforderlich ist.

Im Allgemeinen erfordert die Konvertierung eines imperativen Programms in ein rein funktionales auch sicherzustellen, dass die zuvor veränderlichen Strukturen jetzt explizit von Funktionen zurückgegeben werden, die sie aktualisieren, eine Programmstruktur namens store-passing style .

Rein funktionale Sprache

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

Verweise