Abenteuer Lambda

Werbung
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
Herunterladen