Benutzer:West of House/FP2
Die allgemeingültigen Konzepte der funktionalen Programmierung entstammen der Mathematik der 30er und 40er Jahre. Von besonderer Bedeutung sind der Lambda-Kalkül und die Kategorientheorie. Der Lambda-Kalkül ist ein operatives Regelwerk, mit dessen Hilfe die Bedeutung von symbolischen Ausdrücken bestimmt werden kann. Die Kategorientheorie befasst sich mit der Beziehung zwischen mathematischen Strukturen. Man kann sie zum Beispiel verwenden, um die Struktur eines Computerprogramms auf Strukturen der Anschauung abzubilden und dadurch begründen, warum ein bestimmtes Programm eine bestimmte Aufgabe korrekt löst.
Listen
[Bearbeiten | Quelltext bearbeiten]In der imperativen Programmierung übliche Datenstrukturen wie Arrays sind in der funktionalen Programmierung schwierig im Gebrauch, da sie durch Rekursion nur schwierig darstellbar sind, auch wenn es Ansätze wie das Functional Programming System gibt, die explizit mit solchen Strukturen arbeiten. Listen und Bäume sind hingegen sehr gut mit der Funktionalen Programmierung verträglich.
Sei ein beliebiger Datentyp. Dann ist der Typ der beliebig langen Listen mit mindestens 0 Elementen des Typs gegeben durch die Rekursion . Dabei ist die leere Liste und eine zweistellige Operation, die aus einem Wert und einer Liste neue Liste konstruiert, indem sie vorne an anhängt.
Man kann diesen rekursiven Aufbau benutzen, um Funktionen zu schreiben, die eine Liste zerlegen und dabei einen Wert ermitteln. Eine solche Funktion heißt Katamorphismus.
Katamorphismen
[Bearbeiten | Quelltext bearbeiten]Sei ein Datentyp, ein Wert und eine Abbildung. Dann ist durch
der Katamorphismus (zu griech. κατά = entlang, herab) mit Inititialwert und Verknüpfung gegeben. In der üblichen Notation mit Bananenklammern wird er als geschrieben. Im Sinne der funktionalen Programmierung ist die Zirkumfix-Operation eine Funktion höherer Ordnung. In funktionalen Programmiersprachen gibt es zur Berechnung von Katamorphismen die Funktion reduce
oder fold
. Ein Katamorphismus, der obiger Definition folgt, ist rechtshändig. Er entspricht der folgenden Programmschleife, die eine Liste von ihrem Ende her traversiert:
Ein linkshändiger Katamorphismus würde beim Index 1 beginen.
Viele grundlegende Verfahren der Programmierung sind Katamorphismen. So berechnet die Summe einer Zahlenliste, hängt Strings aneinander und mit berechnet die Länge einer Liste. Eine Funktion, die eine Liste nach Elementen filtert, die die Eigenschaft erfüllen, kann mit der Funktion aus errechnet werden, die wie folgt definiert ist: mit falls und sonst.
Ist die Operation assoziativ mit dem neutralem Element , dann ist der Katamorphismus die eindeutige Erweiterung der Operation auf beliebig viele Argumente. Das ist eine ützliche Eigenschaft, die viel Arbeit in der praktischen Programmierung einsparen kann. Ist zum Beispiel eine zweistellige Funktions-Komposition bereits implementiert, so lässt sich die Komposition von Funktionen als darstellen (dabei ist die identische Abbildung).
Anamorphismen
[Bearbeiten | Quelltext bearbeiten]Während Katamorphismen Listen zu Einzelwerten „eindampfen“, bauen Anamorphismen Listen aus Einzelwerten auf. Die Begriffe sind dual zueinander.
Es sei ein Prädikat und eine Abbildung. Ein Anamorphismus ist dann so definiert:
Der Anamorphismus mit Generator und Prädikat wird mit Linsenklammern notiert: .
Hylomorphismen
[Bearbeiten | Quelltext bearbeiten]Sei ein Katamorphismus und ein Anamorphismus. Dann ist die Abbildung ein sogenanter sogenannter Hylomorphismus (griech. υλη = Holz, Material). Er ist in der Lage, einen ganzen Verarbeitungszyklus darzustellen, innerhalb dessen eine Struktur durch einen Anamorphisus ausgerollt und durch einen Katamorphismus eingedampft wird. Es möglich, die durch den Anamorphisus erzeugte Zwischenstruktur algebraisch zu entfernen, sodass sich eine Darstellung des Hylomorphismus ergibt, die auf diese verzichtet.[1] In der Praxis bedeutet dies eine erhebliche Speicherplatzersparnis.
Es problemlos möglich, einen komplexeren Algorithmus wie den Minimax-Algorithmus, der den besten Zug in einem Zweipersonenspiel findet, als Hylomorphismus darzustellen.[2]