Ein Hauch von Babylon L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 1 Wann ist ein Sprache funktional? Funktionen werden wie alle anderen Daten behandelt. Wir kennen nur Funktionen die einen Namen haben. int twice(int v){ return 2*v; } Andere Daten wie Zahlen brauchen keinen Namen: System.out.println(47.11); L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 2 Expertenmeinungen zu Lisp „The greatest single programming language ever designed.” (Alan Kay) „The most intelligent way to misuse a computer“ (Anonymous) „Lisp is a language for doing what you've been told is impossible.“ (Kent Pitman) „Anyone could learn Lisp in one day, except that if they already knew Fortran, it would take three days.” (Marvin Minsky) L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 3 S-Ausdrücke Ein Atom ist ein Literal oder ein Symbol. Beispiele 47.11, 23 "Hello Lisp" + list defun L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 4 S-Ausdrücke Ein S-Ausdruck ist entweder ein Atom oder ein Paar(U . V) ,wobei U und V ebenfalls SAusdrücke ̈ sind. U V L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 5 S-Ausdrücke in Lisp Der S-Ausdruck (47 . 11) Wird in Lisp so konstruiert: (cons 47 11) Die Liste (23 47 11) können wir so definieren: (cons 23 (cons 47 (cons 11 nil))) Bild siehe http://en.wikipedia.org/wiki/Cons L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 6 S-Ausdrücke in Lisp Ein S-Ausdruck ist also ein Atom oder eine Liste Durch Schachtelung sind Baumstrukturen bildbar: (person (name Müller) (vorname Lothar) ) L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 7 Funktionen in Lisp Funktionen können einen Namen haben: (defun sum(n) (if (eq n 0) 0 (+ n (sum (- n 1))))) Oder anonym definiert werden (lambda(a b) (+ a b)) Wie beim Lambda-Kalkül von Church! L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 8 Typsysteme statisch - dynamisch explizit - implizit sicher - unsicher L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 9 ML - Der Pionier Type Inference (Typableitung) Pattern Matching (Musterabgleich) Polymorphie (Generics) L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 10 ML - Der Pionier Multiparadigmensprachen Funktional Imperativ Objektorientiert L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 11 Haskell – Funktionale Programmierung in Reinform Der Unterschied zwischen Funktionen und Konstanten schwindet weiter. Vieles kann kompakter und klarer formuliert werden. L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 12 Wie sieht das in Haskell aus? Anonyme Funktionen (\a b ->a+b) 2 3 Beispiel ergibt 5 Funktionen höherer Ordnung Der : ist hier der cons-Operator. [] entspricht nil. Beide Definitionen von accu zusammen entsprechen einer Fallunterscheidung durch Pattern Matching. Erste Zeile: Rekursionsabbruch, zweite Zeile: Selbstaufruf. accu f (x:[]) = x accu f (x:xs) = f x (accu f xs) Funktionen höherer Ordnung benutzen Mit obiger Funktion accu und untigem Lambda-Ausdruck werden alle Elemente der Liste multipliziert. Liefert 23*47*11, d.h. 11891: accu (\a b->a*b) [23,47,11] L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 13 Laziness Eine unendliche Folge von Einsen: ones=1:ones Werte werden so spät wie möglich ermittelt L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 14 Wann ist eine Sprache funktional? Absolutes Minimum: Anonyme Funktionen sind möglich. Viele Skriptsprachen funktional: JavaScript Ruby... Java war lange nicht funktional: Closures (so ähnlich wie anonyme Methoden) sind erst ab Java 8 enthalten. L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 15 Welche Sprache nehmen wir? Multiparadigmensprache für die JVM Java Programme können bequem integriert werden. L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 16 Alles klar? In funktionalen Sprachen werden Funktionen wie alle andere Daten behandelt. Insbesondere können wir Funktionen als Argumente an Funktionen übergeben ̈ oder sie können Ergebnisse von Funktionen sein. Solche Funktionen heißen Funktionale oder Funktionen höherer Ordnung L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 17 Alles klar? Das Prädikat ̈ rein funktional tragen nur wenige Sprachen wie Haskell. Die meisten funktionalen Sprachen sind Multiparadigmensprachen. Moderne funktionale Sprachen haben ein statisches, implizites und sicheres Typsystem. Wenn das Typsystem statisch ist, hat jede Funktion einen eigenen Datentyp. Moderne funktionale Sprachen haben viele Eigenschaften wie Pattern Matching, Typableitung und Generics, die es zum ersten Mal in ML gab. L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 18 Alles klar? Einige Sprachen wie Haskell, verwenden die Lazy Evaluation zur Auswertung von Ausdrücken. Hier arbeiten wir mit Java und der funktionalen Sprache Scala. L. Piepmeyer: Funktionale Programmierung - Ein Hauch von Babylon 19