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.

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

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

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

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]

  1. Patrick M. Krusenotto: Funktionale Programmierung und Metaprogrammierung. Springer. Wiesbaden 2016. S. 217ff.
  2. Patrick M. Krusenotto: Funktionale Programmierung und Metaprogrammierung. Springer. Wiesbaden 2016. S. 244ff.