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