Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Funktioniert’s?
Funktionale Programmierung für Anfänger
Funktional, das ist doch nur für Esoteriker?!
Funktional, das ist doch nur für Esoteriker?!
ABN AMRO Amsterdam Risikoanalysen Investmentbanking
AT&T Netzwerksicherheit:...
Funktional, das ist doch nur für Esoteriker?!
Galois, Inc Security, Informationssicherheit, Kryptographie
Google Interne P...
Bekannte funktionale Sprachen
Lisp
Scheme
ML
OCamlMiranda
F#
Erlang
Clojure
Scala
Haskell
Bekannte funktionale Sprachen
Lisp
Scheme
ML
OCamlMiranda
F#
Erlang
Clojure
Scala
Haskell
(JavaScript)
(Java 8)
Bekannte funktionale Sprachen
Lisp
Scheme
ML
OCamlMiranda
F#
Erlang
Clojure
Scala
Haskell
(JavaScript)
(Java 8)
Was ist denn an funktionaler Programmierung so besonders?
Was ist denn an funktionaler Programmierung so besonders?
Immutability
Was ist denn an funktionaler Programmierung so besonders?
Immutability
Jeder Variablen darf nur einmal ein Wert zugewiesen...
Was ist denn an funktionaler Programmierung so besonders?
Immutability
Jeder Variablen darf nur einmal ein Wert zugewiesen...
Was ist denn an funktionaler Programmierung so besonders?
Immutability
Jeder Variablen darf nur einmal ein Wert zugewiesen...
Was ist denn an funktionaler Programmierung so besonders?
Seiteneffektfreiheit
Was ist denn an funktionaler Programmierung so besonders?
Seiteneffektfreiheit
„alles, was den Ablauf eines Computerprogram...
Was ist denn an funktionaler Programmierung so besonders?
Seiteneffektfreiheit
„alles, was den Ablauf eines Computerprogram...
Was ist denn an funktionaler Programmierung so besonders?
Seiteneffektfreiheit
„alles, was den Ablauf eines Computerprogram...
Was ist denn an funktionaler Programmierung so besonders?
Seiteneffektfreiheit
auch nicht direkt durch Java 8 unterstützt -...
Was ist denn an funktionaler Programmierung so besonders?
Seiteneffektfreiheit
auch nicht direkt durch Java 8 unterstützt -...
Was ist denn an funktionaler Programmierung so besonders?
Funktionen sind „first order citizens“
Was ist denn an funktionaler Programmierung so besonders?
Funktionen sind „first order citizens“
Mit Funktionen kann man da...
Funktionen sind Werte
Funktionen sind Werte
Java 8: Statische Methoden
class Examples { static int staticTimes (int x, int y) { return x * y; } ...
Funktionen sind Werte
Java 8: Objektmethoden
class Examples { int times (int x, int y) { return x * y; } }
Examples exampl...
Funktionen sind Werte
Java 8: Lambdas
IntBinaryOperator times = (x, y) -> x * y;
times.applyAsInt(3, 5); // 15
Funktionen sind Werte
Java 8: Lambdas (mit eigenem Funktionsinterface)
interface TimesFunction { int eval(int x, int y); }...
Funktionen sind Werte
Java 8: Lambdas (mit eigenem Funktionsinterface)
interface TimesFunction { int eval(int x, int y); }...
Funktionen sind Funktionsparameter
Funktionen sind Funktionsparameter
Java 8:
class Examples {
static int apply(IntUnaryOperator func, int arg) {
return func...
Funktionen sind Funktionsparameter
Java 8:
class Examples {
static int apply(IntUnaryOperator func, int arg) {
return func...
Funktionen sind Rückgabewerte
Funktionen sind Rückgabewerte
Java 8:
interface FunctionFunction { IntUnaryOperator eval(int x); }
FunctionFunction times ...
Funktionen sind Rückgabewerte
Java 8:
interface FunctionFunction { IntUnaryOperator eval(int x); }
FunctionFunction times ...
Komisch, oder?
Java 8: Zwei verschiedene Aufrufe
IntBinaryOperator times = (x, y) -> x * y;
times.applyAsInt(3, 5); // 15
...
Currying! (oder auch Schönfinkeln)
Currying! (oder auch Schönfinkeln)
In manchen funktionalen Sprachen schreiben wir:
times x y = x * y
und eigentlich passier...
Currying! (oder auch Schönfinkeln)
In manchen funktionalen Sprachen schreiben wir:
times x y = x * y
und eigentlich passier...
Currying! (oder auch Schönfinkeln)
In manchen funktionalen Sprachen schreiben wir:
times x y = x * y
und eigentlich passier...
Wichtige Bibliotheksfunktionen: filter
filter oder auch select
Wichtige Bibliotheksfunktionen: filter
filter oder auch select
Nimmt eine Collection und eine Funktion
Liefert diejenigen El...
Wichtige Bibliotheksfunktionen: filter
filter oder auch select
Nimmt eine Collection und eine Funktion
Liefert diejenigen El...
Wichtige Bibliotheksfunktionen: filter
filter oder auch select
Nimmt eine Collection und eine Funktion
Liefert diejenigen El...
Wichtige Bibliotheksfunktionen: map
map oder auch collect
Wichtige Bibliotheksfunktionen: map
map oder auch collect
Nimmt eine Collection und eine Funktion
Liefert eine Collection,...
Wichtige Bibliotheksfunktionen: map
map oder auch collect
Nimmt eine Collection und eine Funktion
Liefert eine Collection,...
Wichtige Bibliotheksfunktionen: map
map oder auch collect
Nimmt eine Collection und eine Funktion
Liefert eine Collection,...
Wichtige Bibliotheksfunktionen: reduce
reduce oder auch foldl / foldr oder inject
Wichtige Bibliotheksfunktionen: reduce
reduce oder auch foldl / foldr oder inject
Nimmt eine Collection, eine Funktion und...
Wichtige Bibliotheksfunktionen: reduce
reduce oder auch foldl / foldr oder inject
Java 8:
Arrays.asList(2, 3, 4, 5).stream...
Wichtige Bibliotheksfunktionen: reduce
reduce oder auch foldl / foldr oder inject
Java 8:
Arrays.asList(2, 3, 4, 5).stream...
Typinferenz
Haskell: starkes statisches Typsystem
Leichtgewichtige Verwendung dank Typinferenz
Herleitung des allgemeinst ...
Typinferenz
Haskell: starkes statisches Typsystem
Leichtgewichtige Verwendung dank Typinferenz
Herleitung des allgemeinst ...
Typinferenz
Haskell: starkes statisches Typsystem
Leichtgewichtige Verwendung dank Typinferenz
Herleitung des allgemeinst ...
Typinferenz (2)
f x = x + 1
Typinferenz (2)
f x = x + 1
Typ:
f :: Num a => a -> a
Num a : Typklasse. Einschränkung der Typvariablen a auf numerische
T...
Typinferenz (2)
f x = x + 1
Typ:
f :: Num a => a -> a
Num a : Typklasse. Einschränkung der Typvariablen a auf numerische
T...
Eine einfache Berechnung
sum =
10
i=1
i2
Eine einfache Berechnung
sum =
10
i=1
i2
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i * i;
}
Exkurs: Clean Code
Single Responsibility Principle
Exkurs: Clean Code
Single Responsibility Principle
Wie viele Verantwortlichkeiten hat dieser Code?
int sum = 0;
for(int i ...
Exkurs: Clean Code
Single Responsibility Principle
Wie viele Verantwortlichkeiten hat dieser Code?
int sum = 0;
for(int i ...
Exkurs: Clean Code
Single Responsibility Principle
Wie viele Verantwortlichkeiten hat dieser Code?
int sum = 0;
for(int i ...
Exkurs: Clean Code
Single Responsibility Principle
Wie viele Verantwortlichkeiten hat dieser Code?
int sum = 0;
for(int i ...
Exkurs: Clean Code
Single Responsibility Principle
Wie viele Verantwortlichkeiten hat dieser Code?
int sum = 0;
for(int i ...
Exkurs: Clean Code
Single Responsibility Principle
Wie viele Verantwortlichkeiten hat dieser Code?
int sum = 0;
for(int i ...
Trennen der Verantwortlichkeiten
Erzeugen der Zahlenfolge von 1 bis 10
Quadrieren einer Zahl
Berechnen der Quadratzahl jed...
Trennen der Verantwortlichkeiten
Erzeugen der Zahlenfolge von 1 bis 10
IntStream sequence = IntStream.rangeClosed(1, 10);
...
Trennen der Verantwortlichkeiten
Erzeugen der Zahlenfolge von 1 bis 10
IntStream sequence = IntStream.rangeClosed(1, 10);
...
Trennen der Verantwortlichkeiten
Erzeugen der Zahlenfolge von 1 bis 10
IntStream sequence = IntStream.rangeClosed(1, 10);
...
Trennen der Verantwortlichkeiten
Erzeugen der Zahlenfolge von 1 bis 10
IntStream sequence = IntStream.rangeClosed(1, 10);
...
Trennen der Verantwortlichkeiten
Erzeugen der Zahlenfolge von 1 bis 10
IntStream sequence = IntStream.rangeClosed(1, 10);
...
Zusammensetzen der Komponenten
Java 8:
IntStream.rangeClosed(1, 10).map(x -> x*x).reduce(0, (x,y) -> x+y); // 385
Zusammensetzen der Komponenten
Java 8:
IntStream.rangeClosed(1, 10).map(x -> x*x).reduce(0, (x,y) -> x+y); // 385
Haskell:...
Zusammensetzen der Komponenten
Java 8:
IntStream.rangeClosed(1, 10).map(x -> x*x).reduce(0, (x,y) -> x+y); // 385
Haskell:...
Uff!
OK, alle einmal tief durchatmen :-)
Pattern Matching
Fibonacci-Funktion „naiv“:
fib x = if x < 2 then x else fib (x-1) + fib (x-2)
Pattern Matching
Fibonacci-Funktion „naiv“:
fib x = if x < 2 then x else fib (x-1) + fib (x-2)
Fibonacci-Funktion mit Patt...
Algebraische Datentypen
Binärbaum:
data Tree =
Node Tree Tree
| Leaf Int
Algebraische Datentypen
Binärbaum:
data Tree =
Node Tree Tree
| Leaf Int
myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf...
Algebraische Datentypen
Binärbaum:
data Tree =
Node Tree Tree
| Leaf Int
myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf...
Algebraische Datentypen
Binärbaum:
data Tree =
Node Tree Tree
| Leaf Int
myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf...
Algebraische Datentypen
Binärbaum:
data Tree =
Node Tree Tree
| Leaf Int
myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf...
Algebraische Datentypen
Binärbaum:
data Tree =
Node Tree Tree
| Leaf Int
myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf...
Fazit
Funktionale Programmierung ist verbreiteter als man denkt
Manches lässt sich in den nicht-funktionalen Alltag integr...
Fazit
Funktionale Programmierung ist verbreiteter als man denkt
Manches lässt sich in den nicht-funktionalen Alltag integr...
Vielen Dank!
Code & Folien auf GitHub:
https://github.com
/NicoleRauch/FunctionalProgrammingForBeginners
Nicole Rauch
E-Ma...
Upcoming SlideShare
Loading in …5
×

Einführung in die funktionale Programmierung

827 views

Published on

Funktionale Programmierung hat zu guter Letzt auch in Java Einzug gehalten. Es ist jetzt ganz normal, überall mit Lambdas oder mit map() und filter() zu arbeiten. Aber ist das wirklich funktionale Programmierung?

Wie sieht es aus, wenn man Java 8 mit einer althergebrachten funktionalen Programmiersprache vergleicht? Und was kann der Java-Programmierer, der aus der objektorientierten (OO) Entwicklung kommt, von funktionalen Sprachen lernen und in seinen Java-Alltag integrieren?

Auf diese Fragen ging Nicole Rauch in ihrem Referat ein. Ebenso stellte sie die grundlegenden Aspekte er funktionalen Programmierung vor und zeigte auf, was die funktionale Programmierung so besonders macht.

Gerne stellen wir Ihnen die Slides des Referats zur Verfügung.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Einführung in die funktionale Programmierung

  1. 1. Funktioniert’s? Funktionale Programmierung für Anfänger
  2. 2. Funktional, das ist doch nur für Esoteriker?!
  3. 3. Funktional, das ist doch nur für Esoteriker?! ABN AMRO Amsterdam Risikoanalysen Investmentbanking AT&T Netzwerksicherheit: Verarbeitung von Internet-Missbrauchsmeldungen Bank of America Merril Lynch Backend: Laden & Transformieren von Daten Barclays Capital Quantitative Analytics Group Mathematische Modellierung von Derivaten Bluespec, Inc. Modellierung & Verifikation integrierter Schaltkreise Credit Suisse Prüfen und Bearbeiten von Spreadsheets Deutsche Bank Equity Proprietary Trading, Directional Credit Trading Gesamte Software-Infrastruktur Facebook Interne Tools Factis Research, Freiburg Mobil-Lösungen (Backend) fortytools gmbh Webbasierte Produktivitätstools - REST-Backend Functor AB, Stockholm Statische Codeanalyse
  4. 4. Funktional, das ist doch nur für Esoteriker?! Galois, Inc Security, Informationssicherheit, Kryptographie Google Interne Projekte IMVU, Inc. Social entertainment JanRain Netzwerk- und Web-Software MITRE Analyse kryptographischer Protokolle New York Times Bildverarbeitung für die New York Fashion Week NVIDIA In-House Tools Parallel Scientific Hochskalierbares Cluster-Verwaltungssystem Sankel Software CAD/CAM, Spiele, Computeranimation Silk, Amsterdam Filtern und Visualisieren großer Datenmengen Skedge Me Online-Terminvereinbarungen Standard Chartered Bankensoftware Starling Software, Tokio Automatisiertes Optionshandelssystem Suite Solutions Verwaltung technischer Dokumentationen (Quelle: http://www.haskell.org/haskellwiki/Haskell_in_industry)
  5. 5. Bekannte funktionale Sprachen Lisp Scheme ML OCamlMiranda F# Erlang Clojure Scala Haskell
  6. 6. Bekannte funktionale Sprachen Lisp Scheme ML OCamlMiranda F# Erlang Clojure Scala Haskell (JavaScript) (Java 8)
  7. 7. Bekannte funktionale Sprachen Lisp Scheme ML OCamlMiranda F# Erlang Clojure Scala Haskell (JavaScript) (Java 8)
  8. 8. Was ist denn an funktionaler Programmierung so besonders?
  9. 9. Was ist denn an funktionaler Programmierung so besonders? Immutability
  10. 10. Was ist denn an funktionaler Programmierung so besonders? Immutability Jeder Variablen darf nur einmal ein Wert zugewiesen werden
  11. 11. Was ist denn an funktionaler Programmierung so besonders? Immutability Jeder Variablen darf nur einmal ein Wert zugewiesen werden In Java nicht direkt unterstützt
  12. 12. Was ist denn an funktionaler Programmierung so besonders? Immutability Jeder Variablen darf nur einmal ein Wert zugewiesen werden In Java nicht direkt unterstützt Kann trotzdem leicht verwirklicht werden: class Point { private final int x, y; public Point (int x, int y) { this.x = x; this.y = y; } // only read x and y in the remaining code }
  13. 13. Was ist denn an funktionaler Programmierung so besonders? Seiteneffektfreiheit
  14. 14. Was ist denn an funktionaler Programmierung so besonders? Seiteneffektfreiheit „alles, was den Ablauf eines Computerprogramms oder die Außenwelt verändert, ohne von einer Funktion berechnet worden zu sein“
  15. 15. Was ist denn an funktionaler Programmierung so besonders? Seiteneffektfreiheit „alles, was den Ablauf eines Computerprogramms oder die Außenwelt verändert, ohne von einer Funktion berechnet worden zu sein“ Ein-/Ausgabe Exceptions Logging Abhängigkeit von (externen) Konfigurationen Veränderungen des Zustands Nichtdeterminismus (z. B. Zufallszahlengenerator)
  16. 16. Was ist denn an funktionaler Programmierung so besonders? Seiteneffektfreiheit „alles, was den Ablauf eines Computerprogramms oder die Außenwelt verändert, ohne von einer Funktion berechnet worden zu sein“ Ein-/Ausgabe Exceptions Logging Abhängigkeit von (externen) Konfigurationen Veränderungen des Zustands Nichtdeterminismus (z. B. Zufallszahlengenerator) Manche Sprachen zeigen das Vorhandensein von Seiteneffekten sogar in der Typsignatur an
  17. 17. Was ist denn an funktionaler Programmierung so besonders? Seiteneffektfreiheit auch nicht direkt durch Java 8 unterstützt - Codierungsregeln helfen
  18. 18. Was ist denn an funktionaler Programmierung so besonders? Seiteneffektfreiheit auch nicht direkt durch Java 8 unterstützt - Codierungsregeln helfen class SeparationOfSideEffects { public void withSideEffect(){ String initialValue = System.console().readLine(); String result = withoutSideEffect(initialValue); System.out.println("The Result: " + result); } public static String withoutSideEffect(String initialValue){ return /* function result */ ; } }
  19. 19. Was ist denn an funktionaler Programmierung so besonders? Funktionen sind „first order citizens“
  20. 20. Was ist denn an funktionaler Programmierung so besonders? Funktionen sind „first order citizens“ Mit Funktionen kann man dasselbe machen wie mit Strings oder Zahlen
  21. 21. Funktionen sind Werte
  22. 22. Funktionen sind Werte Java 8: Statische Methoden class Examples { static int staticTimes (int x, int y) { return x * y; } } IntBinaryOperator timesVar = Examples::staticTimes; timesVar.applyAsInt(3, 5); // 15
  23. 23. Funktionen sind Werte Java 8: Objektmethoden class Examples { int times (int x, int y) { return x * y; } } Examples examples = new Examples(); IntBinaryOperator timesVar = examples::times; timesVar.applyAsInt(3, 5); // 15
  24. 24. Funktionen sind Werte Java 8: Lambdas IntBinaryOperator times = (x, y) -> x * y; times.applyAsInt(3, 5); // 15
  25. 25. Funktionen sind Werte Java 8: Lambdas (mit eigenem Funktionsinterface) interface TimesFunction { int eval(int x, int y); } TimesFunction times = (x, y) -> x * y; times.eval(3, 5); // 15
  26. 26. Funktionen sind Werte Java 8: Lambdas (mit eigenem Funktionsinterface) interface TimesFunction { int eval(int x, int y); } TimesFunction times = (x, y) -> x * y; times.eval(3, 5); // 15 Haskell: times x y = x * y timesVar = times timesVar 3 5 -- 15
  27. 27. Funktionen sind Funktionsparameter
  28. 28. Funktionen sind Funktionsparameter Java 8: class Examples { static int apply(IntUnaryOperator func, int arg) { return func.applyAsInt(arg); } } Examples.apply(x -> 3 * x, 5); // 15
  29. 29. Funktionen sind Funktionsparameter Java 8: class Examples { static int apply(IntUnaryOperator func, int arg) { return func.applyAsInt(arg); } } Examples.apply(x -> 3 * x, 5); // 15 Haskell: apply func arg = func arg apply ( x -> 3 * x) 5 -- 15
  30. 30. Funktionen sind Rückgabewerte
  31. 31. Funktionen sind Rückgabewerte Java 8: interface FunctionFunction { IntUnaryOperator eval(int x); } FunctionFunction times = x -> { return y -> x * y; }; times.eval(3).applyAsInt(5); // 15
  32. 32. Funktionen sind Rückgabewerte Java 8: interface FunctionFunction { IntUnaryOperator eval(int x); } FunctionFunction times = x -> { return y -> x * y; }; times.eval(3).applyAsInt(5); // 15 Haskell: times x = (y -> x * y) times 3 5 -- 15
  33. 33. Komisch, oder? Java 8: Zwei verschiedene Aufrufe IntBinaryOperator times = (x, y) -> x * y; times.applyAsInt(3, 5); // 15 FunctionFunction times = x -> { return y -> x * y; }; times.eval(3).applyAsInt(5); // 15 Haskell: Zweimal derselbe Aufruf times x y = x * y times 3 5 -- 15 times x = (y -> x * y) times 3 5 -- 15
  34. 34. Currying! (oder auch Schönfinkeln)
  35. 35. Currying! (oder auch Schönfinkeln) In manchen funktionalen Sprachen schreiben wir: times x y = x * y und eigentlich passiert Folgendes: times x = (y -> x * y)
  36. 36. Currying! (oder auch Schönfinkeln) In manchen funktionalen Sprachen schreiben wir: times x y = x * y und eigentlich passiert Folgendes: times x = (y -> x * y) Denn: Funktionen haben immer genau ein Argument
  37. 37. Currying! (oder auch Schönfinkeln) In manchen funktionalen Sprachen schreiben wir: times x y = x * y und eigentlich passiert Folgendes: times x = (y -> x * y) Denn: Funktionen haben immer genau ein Argument Nutzen: Partielle Evaluierung: times x y = x * y times3 = times 3 times3 5 -- 15
  38. 38. Wichtige Bibliotheksfunktionen: filter filter oder auch select
  39. 39. Wichtige Bibliotheksfunktionen: filter filter oder auch select Nimmt eine Collection und eine Funktion Liefert diejenigen Elemente der Collection, für die die Funktion true ergibt
  40. 40. Wichtige Bibliotheksfunktionen: filter filter oder auch select Nimmt eine Collection und eine Funktion Liefert diejenigen Elemente der Collection, für die die Funktion true ergibt Java 8: Stream<Integer> filteredStream = asList(1, 2, 3, 4).stream().filter(x -> x % 2 == 0); filteredStream.toArray(); // new Integer[]{2, 4} filteredStream.collect(Collectors.toList()); // Liste mit 2 und 4
  41. 41. Wichtige Bibliotheksfunktionen: filter filter oder auch select Nimmt eine Collection und eine Funktion Liefert diejenigen Elemente der Collection, für die die Funktion true ergibt Java 8: Stream<Integer> filteredStream = asList(1, 2, 3, 4).stream().filter(x -> x % 2 == 0); filteredStream.toArray(); // new Integer[]{2, 4} filteredStream.collect(Collectors.toList()); // Liste mit 2 und 4 Haskell: filter (x -> x `mod` 2 == 0) [1,2,3,4] -- [2,4]
  42. 42. Wichtige Bibliotheksfunktionen: map map oder auch collect
  43. 43. Wichtige Bibliotheksfunktionen: map map oder auch collect Nimmt eine Collection und eine Funktion Liefert eine Collection, in der die Funktion auf jedes Element der ursprünglichen Collection angewandt wurde
  44. 44. Wichtige Bibliotheksfunktionen: map map oder auch collect Nimmt eine Collection und eine Funktion Liefert eine Collection, in der die Funktion auf jedes Element der ursprünglichen Collection angewandt wurde Java 8: Arrays.asList(1, 2, 3, 4).stream().map(x -> x + 5).toArray(); // new Integer[]{6, 7, 8, 9}
  45. 45. Wichtige Bibliotheksfunktionen: map map oder auch collect Nimmt eine Collection und eine Funktion Liefert eine Collection, in der die Funktion auf jedes Element der ursprünglichen Collection angewandt wurde Java 8: Arrays.asList(1, 2, 3, 4).stream().map(x -> x + 5).toArray(); // new Integer[]{6, 7, 8, 9} Haskell: map (x -> x + 5) [1,2,3,4] -- [6,7,8,9]
  46. 46. Wichtige Bibliotheksfunktionen: reduce reduce oder auch foldl / foldr oder inject
  47. 47. Wichtige Bibliotheksfunktionen: reduce reduce oder auch foldl / foldr oder inject Nimmt eine Collection, eine Funktion und einen Startwert Verbindet Startwert und erstes Element der Collection mit Hilfe der Funktion Verbindet das Ergebnis mit dem nächsten Element der Collection Setzt dies für alle Elemente der Collection fort, bis nur noch ein Element übrigbleibt
  48. 48. Wichtige Bibliotheksfunktionen: reduce reduce oder auch foldl / foldr oder inject Java 8: Arrays.asList(2, 3, 4, 5).stream().reduce(1, (x, y) -> x*y); // 120
  49. 49. Wichtige Bibliotheksfunktionen: reduce reduce oder auch foldl / foldr oder inject Java 8: Arrays.asList(2, 3, 4, 5).stream().reduce(1, (x, y) -> x*y); // 120 Haskell: foldl (*) 1 [2,3,4,5] -- 120
  50. 50. Typinferenz Haskell: starkes statisches Typsystem Leichtgewichtige Verwendung dank Typinferenz Herleitung des allgemeinst möglichen Typs
  51. 51. Typinferenz Haskell: starkes statisches Typsystem Leichtgewichtige Verwendung dank Typinferenz Herleitung des allgemeinst möglichen Typs Beispiel: f x = x
  52. 52. Typinferenz Haskell: starkes statisches Typsystem Leichtgewichtige Verwendung dank Typinferenz Herleitung des allgemeinst möglichen Typs Beispiel: f x = x Typ: f :: a -> a a : Typvariable (vergleichbar mit Generics in Java o. ä.) -> Funktionstyp (Argumenttyp steht links, Ergebnistyp steht rechts)
  53. 53. Typinferenz (2) f x = x + 1
  54. 54. Typinferenz (2) f x = x + 1 Typ: f :: Num a => a -> a Num a : Typklasse. Einschränkung der Typvariablen a auf numerische Typen
  55. 55. Typinferenz (2) f x = x + 1 Typ: f :: Num a => a -> a Num a : Typklasse. Einschränkung der Typvariablen a auf numerische Typen Empfehlung: Typsignatur stets annotieren! Zur Überprüfung der eigenen Annahmen.
  56. 56. Eine einfache Berechnung sum = 10 i=1 i2
  57. 57. Eine einfache Berechnung sum = 10 i=1 i2 int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; }
  58. 58. Exkurs: Clean Code Single Responsibility Principle
  59. 59. Exkurs: Clean Code Single Responsibility Principle Wie viele Verantwortlichkeiten hat dieser Code? int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; }
  60. 60. Exkurs: Clean Code Single Responsibility Principle Wie viele Verantwortlichkeiten hat dieser Code? int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; } Erzeugen der Zahlenfolge von 1 bis 10
  61. 61. Exkurs: Clean Code Single Responsibility Principle Wie viele Verantwortlichkeiten hat dieser Code? int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; } Erzeugen der Zahlenfolge von 1 bis 10 Quadrieren einer Zahl
  62. 62. Exkurs: Clean Code Single Responsibility Principle Wie viele Verantwortlichkeiten hat dieser Code? int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; } Erzeugen der Zahlenfolge von 1 bis 10 Quadrieren einer Zahl Berechnen der Quadratzahl jeder Zahl in der Folge
  63. 63. Exkurs: Clean Code Single Responsibility Principle Wie viele Verantwortlichkeiten hat dieser Code? int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; } Erzeugen der Zahlenfolge von 1 bis 10 Quadrieren einer Zahl Berechnen der Quadratzahl jeder Zahl in der Folge Addieren zweier Zahlen
  64. 64. Exkurs: Clean Code Single Responsibility Principle Wie viele Verantwortlichkeiten hat dieser Code? int sum = 0; for(int i = 1; i <= 10; i++) { sum = sum + i * i; } Erzeugen der Zahlenfolge von 1 bis 10 Quadrieren einer Zahl Berechnen der Quadratzahl jeder Zahl in der Folge Addieren zweier Zahlen Aufsummieren der Quadratzahlen
  65. 65. Trennen der Verantwortlichkeiten Erzeugen der Zahlenfolge von 1 bis 10 Quadrieren einer Zahl Berechnen der Quadratzahl jeder Zahl in der Folge Addieren zweier Zahlen Aufsummieren der Quadratzahlen
  66. 66. Trennen der Verantwortlichkeiten Erzeugen der Zahlenfolge von 1 bis 10 IntStream sequence = IntStream.rangeClosed(1, 10); Quadrieren einer Zahl Berechnen der Quadratzahl jeder Zahl in der Folge Addieren zweier Zahlen Aufsummieren der Quadratzahlen
  67. 67. Trennen der Verantwortlichkeiten Erzeugen der Zahlenfolge von 1 bis 10 IntStream sequence = IntStream.rangeClosed(1, 10); Quadrieren einer Zahl IntUnaryOperator square = x -> x*x; Berechnen der Quadratzahl jeder Zahl in der Folge Addieren zweier Zahlen Aufsummieren der Quadratzahlen
  68. 68. Trennen der Verantwortlichkeiten Erzeugen der Zahlenfolge von 1 bis 10 IntStream sequence = IntStream.rangeClosed(1, 10); Quadrieren einer Zahl IntUnaryOperator square = x -> x*x; Berechnen der Quadratzahl jeder Zahl in der Folge IntStream squaredSequence = sequence.map(square); Addieren zweier Zahlen Aufsummieren der Quadratzahlen
  69. 69. Trennen der Verantwortlichkeiten Erzeugen der Zahlenfolge von 1 bis 10 IntStream sequence = IntStream.rangeClosed(1, 10); Quadrieren einer Zahl IntUnaryOperator square = x -> x*x; Berechnen der Quadratzahl jeder Zahl in der Folge IntStream squaredSequence = sequence.map(square); Addieren zweier Zahlen IntBinaryOperator add = (x,y) -> x+y; Aufsummieren der Quadratzahlen
  70. 70. Trennen der Verantwortlichkeiten Erzeugen der Zahlenfolge von 1 bis 10 IntStream sequence = IntStream.rangeClosed(1, 10); Quadrieren einer Zahl IntUnaryOperator square = x -> x*x; Berechnen der Quadratzahl jeder Zahl in der Folge IntStream squaredSequence = sequence.map(square); Addieren zweier Zahlen IntBinaryOperator add = (x,y) -> x+y; Aufsummieren der Quadratzahlen Integer sum = squaredSequence.reduce(0, add);
  71. 71. Zusammensetzen der Komponenten Java 8: IntStream.rangeClosed(1, 10).map(x -> x*x).reduce(0, (x,y) -> x+y); // 385
  72. 72. Zusammensetzen der Komponenten Java 8: IntStream.rangeClosed(1, 10).map(x -> x*x).reduce(0, (x,y) -> x+y); // 385 Haskell: foldl (+) 0 (map (x -> x*x) [1..10]) -- 385
  73. 73. Zusammensetzen der Komponenten Java 8: IntStream.rangeClosed(1, 10).map(x -> x*x).reduce(0, (x,y) -> x+y); // 385 Haskell: foldl (+) 0 (map (x -> x*x) [1..10]) -- 385 oder (>.>) x f = f x [1..10] >.> map (x -> x*x) >.> foldl (+) 0 -- 385
  74. 74. Uff! OK, alle einmal tief durchatmen :-)
  75. 75. Pattern Matching Fibonacci-Funktion „naiv“: fib x = if x < 2 then x else fib (x-1) + fib (x-2)
  76. 76. Pattern Matching Fibonacci-Funktion „naiv“: fib x = if x < 2 then x else fib (x-1) + fib (x-2) Fibonacci-Funktion mit Pattern Matching: fib 0 = 0 fib 1 = 1 fib x = fib (x-1) + fib (x-2)
  77. 77. Algebraische Datentypen Binärbaum: data Tree = Node Tree Tree | Leaf Int
  78. 78. Algebraische Datentypen Binärbaum: data Tree = Node Tree Tree | Leaf Int myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf 1))) (Leaf 3)
  79. 79. Algebraische Datentypen Binärbaum: data Tree = Node Tree Tree | Leaf Int myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf 1))) (Leaf 3) Summenfunktion:
  80. 80. Algebraische Datentypen Binärbaum: data Tree = Node Tree Tree | Leaf Int myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf 1))) (Leaf 3) Summenfunktion: treeSum (Leaf x) = x
  81. 81. Algebraische Datentypen Binärbaum: data Tree = Node Tree Tree | Leaf Int myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf 1))) (Leaf 3) Summenfunktion: treeSum (Leaf x) = x treeSum (Node m n) = treeSum m + treeSum n
  82. 82. Algebraische Datentypen Binärbaum: data Tree = Node Tree Tree | Leaf Int myTree = Node (Node (Leaf 4) (Node (Leaf 7) (Leaf 1))) (Leaf 3) Summenfunktion: treeSum (Leaf x) = x treeSum (Node m n) = treeSum m + treeSum n treeSum myTree -- 15
  83. 83. Fazit Funktionale Programmierung ist verbreiteter als man denkt Manches lässt sich in den nicht-funktionalen Alltag integrieren Viele Sprachen bringen funktionale Aspekte oder Zusatzmodule mit
  84. 84. Fazit Funktionale Programmierung ist verbreiteter als man denkt Manches lässt sich in den nicht-funktionalen Alltag integrieren Viele Sprachen bringen funktionale Aspekte oder Zusatzmodule mit Referenz: Haskell: http://www.haskell.org
  85. 85. Vielen Dank! Code & Folien auf GitHub: https://github.com /NicoleRauch/FunctionalProgrammingForBeginners Nicole Rauch E-Mail info@nicole-rauch.de Twitter @NicoleRauch Web http://www.nicole-rauch.de Artikel in der nächsten (?) Java Aktuell Ganztägiger Workshop

×