Funktionale Programmiersprache
In einer funktionalen Programmiersprache werden Berechnungen als Auswertung mathematischer Funktionen verstanden. Im Unterschied dazu werden in prozeduralen (oder imperativen) Programmiersprachen Berechnungen als Befehlssequenzen dargestellt, die nacheinander abgearbeitet werden. Die mathematische Grundlage der funktionalen Programmierung ist das &lambda -Kalkül.Anders ausgedrückt:
- Ein funktionales Programm ist eine Abbildung von Eingabedaten auf Ausgabedaten, wohingegen ein imperatives Programm eine Arbeitsanweisung für eine Maschine ist. (Pepper)
- In einem funktionalen Programm wird die Reihenfolge der Berechnungsschritte in der Regel nicht festgelegt, während ein imperatives Programm ohne die Reihenfolge der Abarbeitungsschritte gar nicht verstanden werden kann.
- Funktionale Programmiersprachen erlauben es, Funktionen (wie Daten) als Argumente und Rückgabewerte anderer Funktionen zu behandeln. Dadurch ist es einfach, Operatoren auf Funktionen zu definieren. Dies macht funktionale Programme oft kürzer und abstrakter, erfordert jedoch oft eine Umgewöhnungszeit für Programmiererinnen, die den imperativen Programmierstil gewohnt sind.
| Table of contents |
|
1.1 Reine Funktionale Programmiersprachen
2 Ein Beispiel in SML1.2 Funktionen Höherer Ordnung 1.3 Bedarfsauswertung und Strenge Auswertung 1.4 Typisierung |
Konzepte
Reine Funktionale Programmiersprachen
Reine (engl. pure) funktionale Programme können als mathematische Funktion aufgefasst werden: Ein Ausdruck hat dort während der Programmausführung immer den gleichen Wert. Es gibt keine Zustandsvariablen, die während einer Berechnung geändert werden. Man bezeichnet diese Eigenschaft als Werttreue (engl. referential transparency). Sie vereinfacht Korrektheitsbeweise von Algorithmen wesentlich. Um erwünschte Seiteneffekte (Benutzerinteraktion, Eingabe/Ausgabe-Operationen) beschreiben zu können, sind meist besondere Vorkehrungen notwendig. Die meisten funktionalen Programmiersprachen erlauben allerdings Seiteneffekte und sind nicht daher keine reinen funktionalen Programmiersprachen (Ausnahme: Haskell).Funktionen Höherer Ordnung
Man unterscheidet Funktionen erster Ordnung und Funktionen höherer Ordnung. Bei Funktionen höherer Ordnung sind Funktionen selbst Werte. Dies erlaubt es insbesondere, Funktionen als Ergebnisse oder Parameter anderer Funktionen zu verwenden. Ein typisches Beispiel ist map, um eine beliebige, übergebene Funktion f auf jedes Element einer Liste anzuwenden. Definition in Haskell:map f [] = []
map f (x:xs) = f x : map f xs
f auf das erste Listenelement x an und führt dann einen Rekursionsschritt für die restliche Liste xs durch.Bedarfsauswertung und Strenge Auswertung
Funktionale Sprachen kann man auch nach ihrer Auswertungsstrategie unterscheiden: Bei strenger Auswertung (engl. eager bzw. strict evaluation) werden die Argumente einer Funktion ausgewertet, bevor die Funktion selbst aufgerufen wird. Dem gegenüber steht die Bedarfsauswertung (engl. lazy evaluation), bei der Argumente erst ausgewertet werden, wenn deren Wert in einer Berechnung benötigt wird. Dadurch lassen sich z.B. unendlich große Datenstrukturen (die Liste aller natürlicher Zahlen, die Liste aller Primzahlen, etc.) definieren und bestimmte Algorithmen vereinfachen sich. Manche Berechnungen lassen sich mit strenger Auswertung effizienter ausführen, was Compiler für Sprachen mit Bedarfsauswertung in der Regel berücksichtigen.
Typisierung
Weiterhin kann man funktionale Sprachen einteilen in dynamisch und statisch typisierte Sprachen, die sich dadurch ergeben, dass die Typprüfung während der Laufzeit bzw. während der Übersetzungszeit stattfinden kann. Programmiersprachen wie Haskell und SML sind statisch typisiert und unterstützen Typeninferenz (d.h. der Compiler erkennt die Datentypen automatisch). Programmiersprachen aus der Lisp-Familien sind dynamisch typisiert.
Ein Beispiel in SML
local
val pi = 3.14;
val sq = fn x => x*x;
in
val ringarea = fn (R,r) => pi*(sq R - sq r);
end;
ringarea, die die Fläche berechnet, welche zwischen den beiden konzentrischen Kreisen mit den Radien R und r liegt. Dazu werden die Konstante pi und die Hilfsfunktion sq definiert. Diese werden von ringarea dann für die Berechnung benutzt.Beispiele für funktionale Programmiersprachen






