Hi,
es gibt eine ganze Menge Gründe für die Funktionale Programmierung. Haskell ist hier immer die Vorzeigesprache, da sie schon ein Weilchen eine ganze Menge an Features unterstützt. Du findest auf der offiziellen Seite auch das Paper „Why Functional Programming matters“.
Da siehst du dann nochmal eine Menge der Vorteile.
Imho sind die wichtigsten:
- Currying (High Order Functions)
- Polymorphie
- Lazy Evaluation
- vorallem auch die Zustandsfreiheit
Das funktionale Sprachen gerne an Unis oder Schulen für den Anfang verwendet werden liegt keineswegs allein daran, dass sie einfach zu lernen sind, eine Uni sollte immer den Anspruch der Vollständigkeit haben. Funktionale Programmierung ist halt ein Konzept mit vielen Vorteilen (auf die ich noch kommen werde).
Entscheidend für die Unis ist aber, dass Studenten das gleiche Wissen haben sollen. Insbesondere im ersten Semester gibt es viele unsichere Studenten.
Das Problem ist, dass viele Studenten gerade im ersten Semester sehr unsicher sind. Gerade bei weiblichen Studenten soll dies ein Problem sein. Ist hier keine sexistische These von mir! Es ist ja nun aber bekannt, dass die mathematisch/technisch/naturwissenschaftlichen Studienfächer häufig deutlich mehr männliche als weibliche Studenten haben. Hier fühlen sich Frauen also allein wegen ihrer geringen Anzahl schneller verunsichert. Natürlich geht es genug männlichen Studenten nicht anders (denen trauert die Uni nur weniger nach )
Jetzt gibt es häufig mal Kurse, die sich im ersten Semester der Programmierung widmen. HIer gibt es dann immer die Studenten, die schonmal programmiert haben und eben auch die, denen hier jegliche Erfahrung fehlt. Würde man nun mit C/C++, C# oder Java beginnen, würden einige der Studenten wohl im Vorteil sein und da es dann auch immer wieder Leute gibt, die dass ganz groß raushängen lassen müssen, werden hier einfach Leute verschreckt und brechen viel zu früh ab.
Mit einer funktionalen Sprache hat man eigentlich immer den Vorteil, dass es noch keiner vorher verwendet hat. Damit ist es für alle eine neue Denk- und Programmierweise und es bleiben einem ein paar dumme Sprüche erspart.
Ja, die anderen Vorteile liegen halt in der Mächtigkeit der funktionalen Sprachen.
Funktionale Sprachen haben einfach den Vorteil, dass sie auf dem Lambda Kalkül basieren. Dies ist eine sehr einfache „Ersetzungs“-Regel, die aber alles berechenbare berechnen kann. Der große Vorteil liegt einfach darin, dass alles eine Funktion ist. Ein funktionales Programm wertet eigentlich nur eine Funktion aus. Dazu werden die einzelnen Terme hier reduziert.
Funktionen kennt man aus der Mathematik, Lösungen für Probleme kann man dabei sehr leicht in eine Funktionale Sprache umsetzen.
Eines der schönsten Beispiele ist (finde ich) der Quicksort in Haskell, der besteht einfach nur aus:
[Python]
qsort :: (Ord x) => [x] → [x]
qsort [] = []
qsort (a:as) = [x| x ← as, x < a] ++ [a] ++ [x| x ← as, x >= a]
[/Python]
Die erste Zeile ist dabei die optionale Signatur. Die Sprache Haskell braucht diese nicht einmal. In diesem Fall wird angezeigt, dass eine Liste von Elementen des Typs x in eine Liste des gleichen Typs überführt wird. Dass (Ord x) => ist dabei eine Einschränkung, dass das x ein ordinaler Datentyp sein muss (es muss ja verglichen werden).
Danach wird Pattern matching angewendet, ist die zu sortierende Liste leer, ist die Sortierte Liste natürlich die leere Liste.
Der zweite Fall besteht darin, dass man eine nicht leer Liste hat. Listen sind hier rekursiv definiert, eine Liste ist entweder die leer Liste oder besteht aus einem Kopf und einer Liste. Der zweite Teil ist dann wieder entweder Leer oder hat einen Kopf und eine Liste…
a ist hier einfach der Kopf der Liste, man könnte natürlich auch ein zufälliges Pivotelement suchen. An sich findet man hier aber die Idee des Algorithmus.
[x | x ← as, x < a] heißt einfach nur, dass hier die Liste aller x, mit x aus der Liste as, gebildet wird, wobei für jedes dieser x gilt x < a. Natürlich spricht man in der Mathematik wohl kaum von Listen, aber sieht schon dass es sehr nah einer „normalen“ mathematischen Funktion ist.
So sieht es im allg. immer aus (weswegen der Code gerne als Elegant und leicht verständlich durchgeht). Vorallem hat man hier auch gleich eine formale Spezifikation der Funktion.
Ein ganz wichtiger Vorteil ist, dass es eben nur Funktionen gibt (so ziemlich). Es gibt keine Variablen im eigentlichen Sinne. Jede Funktion hat Funktionsparameter, diese sind aber ebend nur für einen Aufruf dieser Funktion gültig. Damit ist die Ausführung einer Funktion nicht von einem Zustand abhängig. Es können damit keine Seiteneffekte auftreten. Hier werden viele Fehlermöglichkeiten vermutet, die so (zumindest theoretisch) in einer Funktionalen Sprache vermieden werden.
Ein weiterer Vorteil liegt nun darin, dass sich damit die Parameter einer Funktion nach dem Aufruf nicht ändern können (es fehlt ja soetwas wie eine globale Variable oder eine Referenz oder so). Damit ist es egal wann ein Parameter weiter ausgewertet wird.
Das tolle ist, dass ein Parameter halt auch eine Funktion sein kann. Auch dafür gibt es dann sehr viele Beispiele, dass geläufigste ist wohl der Filter. Auch diesen wendet man auf eine Liste an. Man kann hier einfach eine boolsche Funktion F und eine Liste A reingeben und bekommt die Liste B, die alle Elemente aus A enthält, für die F(a in A) wahr ist.
Solche Funktionen können somit z.B. auch Listen erzeugen. Die Länge einer Liste ist dyn., man kann sogar endlos lange Listen schaffen.
Dank der Lazy-Evaluation kann man auch mit solchen Strukturen arbeiten. Statt erst die endlose Liste anzulegen und dann mit dieser weiter zu arbeiten (z.B. aus dieser Liste die ersten 10 Elemente zu nehmen) wird die Funktion erst dann ausgewertet, wenn sie wirklich gebraucht wird.
Auch in der Praxis wird funktional Programmiert. Das amerikanische Militär, die ESA oder NASA (bin mir nicht mehr ganz sicher) und Ericsson setzen als recht große Vertreter auf diese Art der Programmierung.
Man hat wie gesagt ein paar Vorteile. Sicherlich ist es heut zu tage möglich in Java per Gerenerics ähnliches zu ermöglichen wie das Polymorphiesystem von funktionalen Sprachen ermöglicht und über gewisse Pattern lassen sich auch high-order functions nachbauen, aber die Ideen dahinter gibt es schon länger und in der funktionalen Programmierung laufen sie auch. Dazu kommt, dass man fast direkt mathematische Formeln umsetzen kann, was dann natürlich noch weitere Vorteile mit sich bringt.
Das Sprachen wie Python funktinale Sprachkonstrukte neben imperativen erlauben ist nur eines der Zeichen dafür, dass sie nicht ganz nutzlos sein dürfte. Auch in dem Entwurf von C# 3.0 steht der Lambda-Operator drin…
Gruß Der Anmeldeboykottierer (der sich hier vielleicht auch irgendwann anmeldet, mal schauen).