[Informatik-Seminar WS2004/05] [Inhalt] [Zurück] [Weiter]


1. Programme als Funktionen

1.1 Mathematische Definition einer Funktion

1.2 Verwendung in einer Programmiersprache

1.3 Reine funktionale Programmiersprachen

1.4 Einige Konsequenzen

1.1 Mathematische Definition einer Funktion 

Die Mathematik definiert eine Funktion als eine Zuordnungsregel, die den Elementen einer Menge A Elemente einer Menge B zuordnet.

Die genaue Definition lautet: Gegeben seien zwei Mengen A und B und eine Zuordnungsvorschrift, die jedem Element aus A genau einem Element aus B zuordnet. Dann ist durch A und diese Zuordnungsvorschrift eine Funktion f von A in B gegeben.

Es gibt mehrer Schreibweisen in der Mathematik. Die Schreibweise y = f (x) ist der Syntax von Funktionen in der Informatik am ähnlichsten. Y ist dabei ein Element aus der Menge B, x ist ein Element aus der Menge A und f ist die Funktion.

X wird als Argument oder Variable der Funktion f bezeichnet. Man spricht in diesem Zusammenhang auch von unabhängiger (x) und abhängiger (y) Variable. Die Variable y hängt von der Variable x und der Funktion ab. Die Menge A wird als Definitionsmenge oder Definitionsbereich bezeichnet. Da diese Menge angibt, für welche Elemente die Funktion f definiert ist.

1.2 Verwendung in einer Programmiersprache

Dieses Konzept läst sich in Programmiersprachen übertragen und anwenden. Ein Programm reagiert auf Eingaben (Input), verarbeitet diese (Verarbeitung) und liefert eine Ausgabe (Output). Das Programm (oder ein Teil davon) kann man als Funktion verstehen. Die Argumente der Funktion, also die Variable x, bilden die Eingabe. Die Variable y stellt die Ausgabe da.

Ein Programm in einer funktionalen Programmiersprache ist also die Berechnung einer mathematischen Funktion in Abhängigkeit der Eingabe. Die Sichtweise der funktionalen Programmierung konzentriert sich auf das Definieren von Funktionen, die dann zur Laufzeit ausgewertet werden. Die Reihenfolge der Abarbeitung tritt dabei, im Gegensatz zur imperativen Programmierung, vollkommen in den Hintergrund.

1.3 Reine funktionale Programmiersprachen

In der Programmierung muss allerdings ein Unterschied zwischen der Definition und der Anwendung einer Funktion gemacht werden. Dies ist in der Mathematik oftmals vermischt und nicht klar getrennt. Dies ist dort auch nicht nötig. Die Schreibweise Quadrat(x) = x * x ist in der Mathematik üblich. Auch eine Zuweisung von Werten für die Variablen x ist üblich: z.B. Quadrat(x) = 42. Hier wird, anders als in imperativen Programmiersprachen, die Variable als ein aktueller unveränderlicher Wert gesehen. In der imperativen Programmierung sind Variablen Speicherbereiche, dessen Inhalt verändert werden kann. So ist ein Ausdruck wie x = x + 23 möglich. In der Mathematik und somit in funktionalen Programmiersprachen macht dies keine Sinn.

Deshalb muss in der reinen funktionalen Programmierung eine Variable nicht als Speicherbereich, sondern als ein Name für einen Wert verstanden werden. Es gibt also keine Zustandsvariablen, die während der Laufzeit verändert werden. Eine Zuweisung wie x = x + 23 ist somit nicht möglich. Diese Eigenschaft wird "Werttreue" genannt. Dadurch sind Korrektheitstest von Programmen einfacher durchzuführen.

1.4 Einige Konsequenzen

Daraus ergeben sich für das funktionale Programmieren einige Konsequenzen.

Eine wichtige Konsequenz ist, dass es keine Zuweisungen an Variablen gibt. Variablen werden einmal definiert und sind dann unveränderlich, sie dienen nur als Name für einen Wert. Somit kann es keine Schleifen geben, weil somit kein Zähler für die Schleifen gebildet werden kann. Schleifen müssen mit Hilfe der Rekursion realisiert werden. Der Zähler kann so als neues verändertes Argument an die eigene Funktion übergeben werden.

Eine weiter Konsequenz ist, dass eine werttreue Funktion nicht von einem internen Zustand abhängen kann. Das Funktionsergebnis hängt nur von den Argumenten der Funktion und ggf. von nicht-lokalen Konstanten. Eine Funktion muss also bei gleichen Argumenten immer das gleiche Ergebnis liefern. Dabei darf die Ausführungsreihenfolge der Funktion keine Rolle spielen.

Funktionale Programmiersprachen müssen Funktionen als "Funktionen höherer Ordnung" ansehen. Dies bedeutet, dass eine Funktion nicht nur als ausführbare Operation, sondern auch als Datentyp verwendet werden kann. Eine Funktion kann somit auch Argument und Ergebnis sein.


[Informatik-Seminar WS2004/05] [Inhalt] [Zurück] [Weiter] [Seitenanfang]