Abenteuer Lambda
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
1
Relationale Datenbanken
Fname
Lname
Salary
Mickey
Mouse
12.000
Donald
Duck
9.000
...
...
..
Daten sind in Tabellen organisiert
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
2
Relationale Datenbanken
Mit wenig Code viel erreichen:
select fname, lname
from employee
where salary>10000
order by lname
Deklarativ
„Ermittle die Vor- und Nachnamen aller Mitarbeiter, die
mehr als 10.000 verdienen und sortiere das Ergebnis nach
den Nachnamen“.
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
3
Der alte Weg
Alle Zahlen von 0 bis 100 addieren
int n=100, sum=0;
while(n!=0){
sum=sum+n;
n=n-1;
}
System.out.println(sum);
Imperativ
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
4
John von Neumann
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
5
Was ist funktionale Programmierung?
Jedes Programm ist eine Funktion
Jede Funktion kann weitere Funktionen aufrufen
Funktionen werden wie andere Daten
behandelt.
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
6
Was ist eine Funktion?
Eine Funktion f ermittelt zu einer Liste von
Argumenten für Parametern
p1,...,pn
einen Wert
f(p1,...,pn)
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
7
Beispiele
Parameterlisten können leer sein
int a(){
return 42;
}
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
8
Beispiele
Funktionen mit
einem Parameter vom Typ int und
Rückgabetyp int
int twice(int v){
return 2*v;
}
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
9
Beispiele
Kein Rückgabewert, also keine Funktion!
void printInteger(int v){
System.out.println(2*v);
}
Funktionen haben keine Nebenwirkungen
(Seiteneffekte)
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
10
Was ist funktionale Programmierung?
Jedes Programm ist eine Funktion
Jede Funktion kann weitere Funktionen aufrufen
Funktionen werden wie andere Daten behandelt.
Funktionen können verknüpft werden
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
11
Beispiele
Verknüpfungen sind nicht immer möglich
Math.sqrt((Math.abs(-25)));
Verknüpfungen sind nicht kommutativ
Math.abs((Math.sqrt(-25)));
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
12
Anweisungsfolgen
Das Semikolon ist keine Verknüpfung
int sum(int v){
int result=0;
for(int i=v; i>0; i--)
result+=i;
return result;
}
Funktionen enthalten keine Folgen von
Anweisungen!
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
13
Keine Variable
Zuweisungen von Werten sind keine Funktionen!
int sum(int v){
int result=0;
for(int i=v; i>0; i--)
result+=i;
return result;
}
In der funktionalen Programmierung gibt es
nur Konstante!
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
14
Geht das denn?
Können wir überhaupt alles ohne Variable und
ohne Anweisungsfolgen berechen?
In unserem Beispiel schon...
int sum(int v){
return v<=0 ? 0 : v +sum(v-1);
}
Aber genauso viel wie mit Java?
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
15
Alonzo Church und der Lambda-Kalkül
Ja!
Alles was man mit
imperativen
Programmiersprachen
berechnen kann,
kann man auch mit
Funktionen berechnen
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
16
Referenzielle Transparenz
Funktionen müssen fü̈r gleiche Argumente
immer das gleiche Ergebnis liefern.
Math.random()
Keine Funktion!
class Simple{
private int a=1;
int doubleA(){
return a*=2;
}
}
doubleA ist
keine Funktion!
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
17
Referenzielle Transparenz
Wenn aber der Ausführungszeitpunkt einer
Funktion beliebig ist,
ist parallele Ausführung ohne Umbauarbeiten
möglich
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
18
Alles klar?
Programme, die mit imperativen Sprachen wie C
oder Java entwickelt werden, orientieren sich an
der von-Neumann-Architektur der Hardware.
In der deklarative Programmierung geht es um
das Ergebnis der Berechnungen und nicht um
die Realisierung des Rechenweges mit einer
Maschine.
Die funktionale Programmierung bietet uns eine
Möglichkeit unseren Code deklarativ zu
entwickeln.
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
19
Alles klar?
In reinen funktionalen Programmiersprachen
bestehen Funktionen nur aus Verknüpfungen
und Aufrufen von Funktionen.
Das ganze Programm ist eine Funktion.
Der Lambda-Kalkül ist die mathematischlogische Grundlage funktionaler
Programmiersprachen.
Funktionale Programmiersprachen sind daher
Turing-vollständig.
Wir können mit ihnen genau so viel wie mit
imperativen Sprachen machen.
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
20
Alles klar?
In der funktionalen Programmierung hängt das
Ergebnis einer Berechnung nicht vom Zeitpunkt
der Berechnung ab.
Aufgrund dieser referentiellen Transparenz
können funktionale Programme leicht
parallelisiert werden.
In der funktionalen Programmierung gibt es
keine Variablen, Schleifen werden durch
Rekursion ersetzt.
L. Piepmeyer: Funktionale Programmierung - Abenteuer Lambda
21