Unser Funktionsbegriff ist so allgemein,
daß er auch
Funktionale
und
höhere Funktionen
umfaßt;
darunter versteht man gelegentlich Operationen,
bei denen in einem Term nicht nur Variablen,
sondern auch Funktionssymbole durch Argumente (geeigneten Typs)
ersetzt werden.
Solche Operationen sind schon vom Gymnasium her bekannt, werden aber dort meist nicht als Funktionen aufgefaßt.
Beispiel: die Differentiation
D: [Rüberführt eine reelle (differenzierbare) Funktion f in ihre Ableitungsfunktion D(f) = f'. Das kann geschrieben werden:R]
[R
R]
D =f . f'
oder deutlicher
D =
f . (
x . f'(x))
Ein bestimmtes Integral auf einem festen Intervall (a,b)
überführt eine reelle Funktion f in einen reellen Wert ,
ist also vom Typ [R
R]
R
und kann geschrieben werden:
I =f .
f(t) dt
Das Bilden einer Stammfunktion macht dagegen
aus einer reellen Funktion
wieder eine reelle Funktion , ist also vom gleichen Typ
[R
R]
[R
R]
wie die Differentiation.
Wir bekommen die Stammfunktion, indem wir das bestimmte Integral
von der oberen Grenze abhängen lassen,
das geht mit der Lambda-Notation (und nur mit ihr) sehr bequem:
S =f . (
b .
f(t) dt)
Die Operation: Auswertung einer beliebigen reellen Funktion f
an einer gegebenen festen reellen Stelle a ist vom gleichen Typ
[R
R]
R
wie das Bilden des bestimmten Integrals
und kann geschrieben werden:
A =f . f(a)
im Gegensatz zur Funktion f selbst:
f =
x . f(x)
Modula 2 ist (neben LISP) eine der wenigen Programmiersprachen, in denen sich höhere Funktionen bequem programmieren lassen, da es hier auch Prozedur-Typen gibt.