logo

Funktionales Programmierparadigma

Einführung
Funktionale Programmierung ist ein Programmierparadigma, bei dem wir versuchen, alles im Stil rein mathematischer Funktionen zu binden. Es handelt sich um einen deklarativen Programmierstil. Sein Hauptaugenmerk liegt darauf, was gelöst werden soll, im Gegensatz zu einem imperativen Stil, bei dem der Schwerpunkt auf der Frage liegt, wie gelöst werden soll. Es verwendet Ausdrücke anstelle von Anweisungen. Ein Ausdruck wird ausgewertet, um einen Wert zu erzeugen, während eine Anweisung ausgeführt wird, um Variablen zuzuweisen. Diese Funktionen weisen einige Sonderfunktionen auf, die im Folgenden erläutert werden.

Die funktionale Programmierung basiert auf der Lambda-Kalküle:
Lambda-Kalkül ist ein von Alonzo Church entwickeltes Framework zur Untersuchung von Berechnungen mit Funktionen. Man kann sie als die kleinste Programmiersprache der Welt bezeichnen. Es gibt die Definition dessen, was berechenbar ist. Alles, was mit der Lambda-Rechnung berechnet werden kann, ist berechenbar. In ihrer Rechenfähigkeit entspricht sie der Turing-Maschine. Es bietet einen theoretischen Rahmen zur Beschreibung von Funktionen und deren Bewertung. Es bildet die Grundlage fast aller aktuellen funktionalen Programmiersprachen.
Tatsache: Alan Turing war ein Schüler von Alonzo Church, der die Turing-Maschine entwickelte, die den Grundstein für den imperativen Programmierstil legte.

Programmiersprachen, die funktionale Programmierung unterstützen: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.



Konzepte der funktionalen Programmierung:

  • Reine Funktionen
  • Rekursion
  • Referenzielle Transparenz. Funktionen sind erstklassig und können Variablen höherer Ordnung sein, die unveränderlich sind

Reine Funktionen: Diese Funktionen haben zwei Haupteigenschaften. Erstens erzeugen sie unabhängig von allem anderen immer die gleiche Ausgabe für die gleichen Argumente.
Zweitens haben sie keine Nebenwirkungen, d. h. sie verändern keine Argumente oder lokalen/globalen Variablen oder Eingabe-/Ausgabeströme.
Späteres Eigentum wird Unveränderlichkeit genannt. Das einzige Ergebnis der reinen Funktion ist der Wert, den sie zurückgibt. Sie sind deterministisch.
Mit funktionaler Programmierung erstellte Programme sind leicht zu debuggen, da reine Funktionen keine Nebenwirkungen oder versteckten E/A haben. Reine Funktionen erleichtern auch das Schreiben paralleler/gleichzeitiger Anwendungen. Wenn der Code in diesem Stil geschrieben ist, kann ein intelligenter Compiler viele Dinge tun – er kann die Anweisungen parallelisieren, auf die Auswertung der Ergebnisse warten, wenn sie benötigt werden, und die Ergebnisse speichern, da sich die Ergebnisse nie ändern, solange sich die Eingabe nicht ändert.
Beispiel der reinen Funktion:

sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>

Rekursion: In funktionalen Sprachen gibt es keine for- oder while-Schleife. Die Iteration in funktionalen Sprachen wird durch Rekursion implementiert. Rekursive Funktionen rufen sich wiederholt auf, bis sie den Basisfall erreichen.
Beispiel für die rekursive Funktion:

fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>

Referenzielle Transparenz: In funktionalen Programmen ändern einmal definierte Variablen ihren Wert im gesamten Programm nicht. Funktionale Programme haben keine Zuweisungsanweisungen. Wenn wir einen Wert speichern müssen, definieren wir stattdessen neue Variablen. Dadurch werden Nebenwirkungen ausgeschlossen, da jede Variable zu jedem Zeitpunkt der Ausführung durch ihren tatsächlichen Wert ersetzt werden kann. Der Zustand jeder Variablen ist zu jedem Zeitpunkt konstant.

Beispiel:

x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>

Funktionen sind erstklassig und können von höherer Ordnung sein: Erstklassige Funktionen werden als erstklassige Variablen behandelt. Die Variablen der ersten Klasse können als Parameter an Funktionen übergeben, von Funktionen zurückgegeben oder in Datenstrukturen gespeichert werden. Funktionen höherer Ordnung sind Funktionen, die andere Funktionen als Argumente annehmen und auch Funktionen zurückgeben können.

Beispiel:

show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function>

Variablen sind unveränderlich: In der funktionalen Programmierung können wir eine Variable nach der Initialisierung nicht mehr ändern. Wir können neue Variablen erstellen – aber wir können bestehende Variablen nicht ändern, und das hilft wirklich dabei, den Status während der gesamten Laufzeit eines Programms aufrechtzuerhalten. Sobald wir eine Variable erstellt und ihren Wert festgelegt haben, können wir voll und ganz darauf vertrauen, dass sich der Wert dieser Variablen nie ändern wird.

Vor- und Nachteile der funktionalen Programmierung

Vorteile:

  1. Reine Funktionen sind leichter zu verstehen, da sie keinen Zustand ändern und nur von der ihnen gegebenen Eingabe abhängen. Welche Ausgabe sie auch erzeugen, es ist der Rückgabewert, den sie zurückgeben. Ihre Funktionssignatur enthält alle Informationen über sie, d. h. ihren Rückgabetyp und ihre Argumente.
  2. Die Fähigkeit funktionaler Programmiersprachen, Funktionen als Werte zu behandeln und sie als Parameter an Funktionen zu übergeben, macht den Code lesbarer und leichter verständlich.
  3. Das Testen und Debuggen ist einfacher. Da reine Funktionen nur Argumente annehmen und Ausgaben erzeugen, erzeugen sie keine Änderungen, nehmen keine Eingaben entgegen und erzeugen keine versteckten Ausgaben. Sie verwenden unveränderliche Werte, sodass es einfacher wird, einige Probleme in Programmen zu überprüfen, die mit reinen Funktionen geschrieben wurden.
  4. Es wird verwendet, um Parallelität/Parallelität zu implementieren, da reine Funktionen keine Variablen oder andere Daten außerhalb davon ändern.
  5. Es verwendet eine verzögerte Auswertung, die eine wiederholte Auswertung vermeidet, da der Wert nur dann ausgewertet und gespeichert wird, wenn er benötigt wird.

Nachteile:

kostenlos gegen kostenlos
  1. Manchmal kann das Schreiben reiner Funktionen die Lesbarkeit des Codes beeinträchtigen.
  2. Das Schreiben von Programmen im rekursiven Stil anstelle der Verwendung von Schleifen kann etwas einschüchternd sein.
  3. Reine Funktionen zu schreiben ist einfach, aber ihre Kombination mit dem Rest der Anwendung und E/A-Operationen ist eine schwierige Aufgabe.
  4. Unveränderliche Werte und Rekursion können zu Leistungseinbußen führen.

Anwendungen:

  • Es wird in mathematischen Berechnungen verwendet.
  • Es wird dort benötigt, wo Parallelität oder Parallelität erforderlich sind.

Fakt: Whatsapp benötigt für seine 900M nur 50 Ingenieure Benutzer weil Erlang zur Umsetzung seiner Parallelitätsanforderungen verwendet wird. Facebook verwendet Haskell in seinem Anti-Spam-System.