2.3. Lambda-Kalkül
Bei der Beschreibung von Programmiersprachen spricht man von zwei abstrakten Modellen.
Imperativen Sprachen werden durch das Modell der Turingmaschine
beschrieben. Das bedeutet, dass sie aus einer Folge von Befehlen
bestehen, welche streng einer nach dem anderen hintereinander ausgeführt werden.
Das Lambda Kalkül hingegen bietet eine Abstraktion funktionaler
Sprachen, es wird dazu benutzt, um eine Funktionsdefinitions zu Abstrahieren.
\x -> A
ist die allgemeine Form,
welche eine (anonyme) Funktion definiert, die ein x bekommt und einen Ausdruck A als Funktionskörper hat.
Als Bausteine für das Lambda-Kalkül gibt es nur
Funktionsdefinition und Funktionsabstraktion, keine Zahlen,
Funktionsnamen, arithmetische Funktionen, Wahrheitswerte.
Alle Berechnungen werden auf die Definition von Funktionen und deren Anwendung zurückgeführt.
Diese Art der Funktionsdefinition wird benutzt, wenn die Funktion ohne
eigenen Bezeichner verwendet werden soll. Dies bedeutet, dass die
Funktion nur aus einer Funktion heraus aufgerufen werden kann, sie
kann ohne Funktionsbezeichner nicht alleine appliziert werden.
Beispiel: Funktionsdefinition
\x -> x^2 (definiert die Quadratfunktion)
Beispiel: Anwendung einer anonymen Funktion
(\x -> x^2) 2 -> 4 (anonyme Funktion)
twice (\x -> x^2)
Prinzipiell werden auch konstante Werte z.B. Zahlen als Funktionen
definiert, in der Form Nachfolger(Nachfolger(Start)).
In den funktionalen Sprachen werden sie jedoch vordefiniert, so dass
man nicht mit komplizierten Funktionsdefinitionen hantieren muss.
Beispiel: Definition der Wahrheitswerte und if-then
\x y -> x (Projektion auf das 1.Argument -> true)
\y x -> y (Projektion auf das 2.Argument ->false)
\b x y -> b x y (b ist entweder true oder false)
Ohne Variablen und arithmetischen Ausdrücken existiert natürlich
auch keine Iteration. Alle Probleme werden über Funktionen und Rekursion gelöst.
Bemerkenswert ist hierbei, dass keine festen Typen zugewiesen werden,
Lambda-Ausdrücke sind untypisiert. Eine Funktion kann daher auf
Zahlen, Zeichenfolgen oder Funktionen angewendet werden, ohne sie umzuschreiben.
Auf diese Weise kann ein Sortieralgorithmus geschrieben werden, der ohne Veränderung, auf Zahlen, Zeichenfolgen, Listen u.a. angewendet werden kann.