Anhand von Beispielen werden einige Konzepte der funktionalen Programmierung im Allgemeinen und die objekt-funktionale Sprache Scala im Besonderen vorgestellt.
Vortrag von 42ways im Rahmen der IT-Weiterbildungsveranstaltungen bei der SwissLife AG, Niederlassung für Deutschland, München.
Überblick über die Entwicklung mit Clojure bei HEROLABS.
* Warum haben wir uns für Clojure entschieden? (Simplicity, Erweiterbarkeit, Java-Interop)
* Was heißt Funktionale Programmierung?
=> Man braucht ein anderes Mindset
* Was uns stört.
* Und wie entwickelt man mit Clojure (Ecosystem)?
Anlass war ein Talk bei mgm-tp.
der aktuelle Stand Perl 5.20 an features und Kultur: beeinflusst von Perl 6 wird an den wesentlichen Stellen aufgeräumt: dies war das Update für den Linuxtag in Chemnitz März 2015
Überblick über die Entwicklung mit Clojure bei HEROLABS.
* Warum haben wir uns für Clojure entschieden? (Simplicity, Erweiterbarkeit, Java-Interop)
* Was heißt Funktionale Programmierung?
=> Man braucht ein anderes Mindset
* Was uns stört.
* Und wie entwickelt man mit Clojure (Ecosystem)?
Anlass war ein Talk bei mgm-tp.
der aktuelle Stand Perl 5.20 an features und Kultur: beeinflusst von Perl 6 wird an den wesentlichen Stellen aufgeräumt: dies war das Update für den Linuxtag in Chemnitz März 2015
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.
Guava - Google Core Libraries for Java 1.5+ - Utility-Klassen, Datenstrukturen und Erweiterungen. Grundlagen, Features und Beispiele. Erstellt von http://www.essential-bytes.de
Warum ECMAScript 6 die Welt ein Stückchen besser machtSebastian Springer
Wo die Neuerungen von ECMAScript 5 recht unspektakulär waren, sind die Features des neuen Sprachstandards umso interessanter. ECMAScript 6 versucht einige Anforderungen zu erfüllen, mit denen man als JavaScript-Entwickler täglich konfrontiert ist. Klassische Beispiele sind hier Promises zum Umgang mit asynchronen Funktionen, ein Module Loader zur Strukturierung der Applikation, Generatoren und Iteratoren oder aber ein neuer Gültigkeitsbereich für Variablen. Aber nicht nur große Änderungen, sondern auch sinnvolle Erweiterungen bestehender Objekte wie String und Array halten mit dem neuen Standard Einzug in den Browser. Problematisch wird die Situation jedoch, wenn man in den Genuss verschiedener Features kommen möchte, die aktuell noch von keinem Browser unterstützt werden. Hier schafft Traceur, der ECMAScript-6-Compiler von Google, Abhilfe.
Dieser Vortrag erklärt, was der PHP_CodeSniffer ist, was er kann, wozu er gut ist, wie man einen eigenen Standard mit eigenen Regeln erstellt und warum man Ihn nutzen sollte.
Er wurde am 22. September 2010 bei der PHP Usergroup Düsseldorf, Duisburg, Krefeld gehalten.
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyThorsten Kamann
Gute Software sollte sich an der entsprechenden Fachdomäne orientieren und nicht an der zugrundeliegenden Technologie. Um dies zu erreichen, wird allerdings eine Basis benötigt, die technisch ausgereift ist ohne Einschränkungen für die Entwicklung. Eine solche Basis kann mit dem Springframework geschaffen werden. Die Kombination von Spring, Annotations, Java Persistence (JPA) und Unit-Testing erlaubt eine flexible und modulare Architektur und könnte eine mögliche technische Basis für ein solches Softwaresystem sein.
Dieser Vortrag stellt einen Lösungsansatz anhand eines einfachen Beispiels vor. Die Aufbereitung der Inhalte orientiert sich dabei an einem typischen test-zentrierten Entwicklungsprozess. Folgende Themen werden angesprochen:
* Einleitung Spring und JPA, Maven, Groovy
* Projektstruktur
* Entwicklung der API (der Schnittstellen)
* Test-getriebene Entwicklung der Implementierung
* Spring-unterstützte Integrationstests
Ausblick:
* Spring 2.5 - mehr Annotations; Verwaltung von Entities mit Spring
* Webschicht - Anbindung einer Webanwendung mit Java Server Faces (JSF)
* Spring-Webservices - Contract-First Webservices mit Spring-WS 1.0
Organize & manage master meta data centrally, built upon kong, cassandra, neo4j & elasticsearch. Managing master & meta data is a very common problem with no good opensource alternative as far as I know, so initiating this project – MasterMetaData.
This document discusses functional programming and audio programming. It introduces LazyK, a purely functional and stream-based programming language based on SKI combinator calculus. It also introduces RazyK, a LazyK interpreter implemented in Ruby that allows stepping through reduction steps and includes a browser interface and audio stream mode to evaluate LazyK programs that generate music.
Digital Creation & Innovation provides software consulting and training, develops software products, and works on open source projects. Their services include architecture design, big data technologies, and niche technologies. Their software products are SiteInteract and InteractSimple. Their open source projects include MasterMetaData, Krishakanam, Vaachak, and Sanskrisp. They can be contacted through their website or offices in Bangalore, India.
This document provides instructions for a hands-on lab to install and configure DevStack, an OpenStack cloud software stack, on an Ubuntu virtual machine. It outlines 9 tasks to: 1) bring up the Ubuntu VM; 2) install DevStack from the stable Kilo branch; 3) bring up the DevStack Horizon dashboard; 4) configure a demo tenant network; 5) configure a demo tenant router; 6) configure a demo tenant instance; 7) add access rules to allow pinging and SSHing to the instance; 8) add a floating IP for the instance; and 9) celebrate the successful completion of the lab. Setup instructions are provided for using either VMware or VirtualBox virtualization software.
AngularJS is a javascript framework for creating dynamic web applications. This presentation covers anatomy of angular application and concept of directives which is at core of angular. Only Angular 1.x is covered and code examples along with many concepts may not be valid with Angular 2.
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.
Guava - Google Core Libraries for Java 1.5+ - Utility-Klassen, Datenstrukturen und Erweiterungen. Grundlagen, Features und Beispiele. Erstellt von http://www.essential-bytes.de
Warum ECMAScript 6 die Welt ein Stückchen besser machtSebastian Springer
Wo die Neuerungen von ECMAScript 5 recht unspektakulär waren, sind die Features des neuen Sprachstandards umso interessanter. ECMAScript 6 versucht einige Anforderungen zu erfüllen, mit denen man als JavaScript-Entwickler täglich konfrontiert ist. Klassische Beispiele sind hier Promises zum Umgang mit asynchronen Funktionen, ein Module Loader zur Strukturierung der Applikation, Generatoren und Iteratoren oder aber ein neuer Gültigkeitsbereich für Variablen. Aber nicht nur große Änderungen, sondern auch sinnvolle Erweiterungen bestehender Objekte wie String und Array halten mit dem neuen Standard Einzug in den Browser. Problematisch wird die Situation jedoch, wenn man in den Genuss verschiedener Features kommen möchte, die aktuell noch von keinem Browser unterstützt werden. Hier schafft Traceur, der ECMAScript-6-Compiler von Google, Abhilfe.
Dieser Vortrag erklärt, was der PHP_CodeSniffer ist, was er kann, wozu er gut ist, wie man einen eigenen Standard mit eigenen Regeln erstellt und warum man Ihn nutzen sollte.
Er wurde am 22. September 2010 bei der PHP Usergroup Düsseldorf, Duisburg, Krefeld gehalten.
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyThorsten Kamann
Gute Software sollte sich an der entsprechenden Fachdomäne orientieren und nicht an der zugrundeliegenden Technologie. Um dies zu erreichen, wird allerdings eine Basis benötigt, die technisch ausgereift ist ohne Einschränkungen für die Entwicklung. Eine solche Basis kann mit dem Springframework geschaffen werden. Die Kombination von Spring, Annotations, Java Persistence (JPA) und Unit-Testing erlaubt eine flexible und modulare Architektur und könnte eine mögliche technische Basis für ein solches Softwaresystem sein.
Dieser Vortrag stellt einen Lösungsansatz anhand eines einfachen Beispiels vor. Die Aufbereitung der Inhalte orientiert sich dabei an einem typischen test-zentrierten Entwicklungsprozess. Folgende Themen werden angesprochen:
* Einleitung Spring und JPA, Maven, Groovy
* Projektstruktur
* Entwicklung der API (der Schnittstellen)
* Test-getriebene Entwicklung der Implementierung
* Spring-unterstützte Integrationstests
Ausblick:
* Spring 2.5 - mehr Annotations; Verwaltung von Entities mit Spring
* Webschicht - Anbindung einer Webanwendung mit Java Server Faces (JSF)
* Spring-Webservices - Contract-First Webservices mit Spring-WS 1.0
Organize & manage master meta data centrally, built upon kong, cassandra, neo4j & elasticsearch. Managing master & meta data is a very common problem with no good opensource alternative as far as I know, so initiating this project – MasterMetaData.
This document discusses functional programming and audio programming. It introduces LazyK, a purely functional and stream-based programming language based on SKI combinator calculus. It also introduces RazyK, a LazyK interpreter implemented in Ruby that allows stepping through reduction steps and includes a browser interface and audio stream mode to evaluate LazyK programs that generate music.
Digital Creation & Innovation provides software consulting and training, develops software products, and works on open source projects. Their services include architecture design, big data technologies, and niche technologies. Their software products are SiteInteract and InteractSimple. Their open source projects include MasterMetaData, Krishakanam, Vaachak, and Sanskrisp. They can be contacted through their website or offices in Bangalore, India.
This document provides instructions for a hands-on lab to install and configure DevStack, an OpenStack cloud software stack, on an Ubuntu virtual machine. It outlines 9 tasks to: 1) bring up the Ubuntu VM; 2) install DevStack from the stable Kilo branch; 3) bring up the DevStack Horizon dashboard; 4) configure a demo tenant network; 5) configure a demo tenant router; 6) configure a demo tenant instance; 7) add access rules to allow pinging and SSHing to the instance; 8) add a floating IP for the instance; and 9) celebrate the successful completion of the lab. Setup instructions are provided for using either VMware or VirtualBox virtualization software.
AngularJS is a javascript framework for creating dynamic web applications. This presentation covers anatomy of angular application and concept of directives which is at core of angular. Only Angular 1.x is covered and code examples along with many concepts may not be valid with Angular 2.
Erlang supervision trees helps bring fault tolerance, recovery and robustness to erlang applications. The presentation goes through basic and advanced examples along with supervision strategies.
The document provides an overview of different build tools available for Erlang projects, including Emakefile, Rebar, Rebar3, Erlang.mk, and Mix. Each tool has its own strengths in areas like packaging and releases, documentation, compilation and tests, and dependency management. The document describes how to set up a basic project using each tool and references additional online resources for using the tools in Erlang and Elixir development.
Prinzipien funktionaler Programmierung. Vergleich deklarative versus imperative Sprachen. Rekursionen statt Schleifen. Funktionen als gleichberechtigte Datenobjekte. Führt zu kürzere, klareren und zuverlässigeren Programmen, die einfacher zu warten sind.
nagiosplugin - eine Python-Bibliothek für Monitoring-Plugins Christian Kauhaus
Auch wenn in der letzten Zeit sehr viel Bewegung in die Monitoring-Szene gekommen ist (#monitoringsucks etc.), werden die Platzhirsche Nagios/Icinga und ihre Standards auf absehbare Zeit nicht verschwinden. Das Nagios-Plugin-API stellt eine sehr weit verbreitete Schnittstelle zur Anbindung einzelner Checks an Monitoring-Systeme dar. Obwohl das API in den Grundzügen sehr einfach ist, ist der Programmieraufwand für vollständig konforme Plugins erstaunlich hoch.
Die nagiosplugin-Bibliothek nimmt dem Entwickler viele Details ab, so dass er sich auf den Inhalt seiner Checks konzentrieren kann. Der Vortrag führt in das Schreiben von Nagios-kompatiblen Plugins ein, zeigt den typischen Aufbau von Nagios-Plugins und das Grundprinzip eigener Plugins. Die Konfiguration und der Betrieb von Monitoring-Systemen im Großen sollen nicht thematisiert werden.
Video: http://pyvideo.org/video/1460/nagiosplugin-eine-python-bibliothek-fur-monitor
Konferenzseite: https://2012.de.pycon.org/programm/schedule/sessions/45/
Projekt-Homepage: https://projects.gocept.com/projects/nagiosplugin/wiki
Vortrag der OOP 2014
Überblick über die Vorteile der Programmiersprache Go für skalierbare Anwendungen sowie ein Einblick in hierbei zu beachtende Probleme und ihre Lösung.
In PostgreSQL kann man sich mit "explain" ansehen, welchen Execution Plan PostgreSQL für eine Query verwendet. Das hilft beim Suchen von Performance Problemen und hilft, den Durchsatz der Database zu steigern.
Mit Java 8 haben endlich Lambdas in den Sprachumfang von Java Einzug gehalten. Mittels Lambdas lassen sich viele Probleme kurz und prägnant ausdrücken. Vorliegende Auskopplung aus Handouts zur Vorlesung Programmieren I führt Lambdas und Streams ein und erläutert den Einsatz an vielen kleineren Beispielen.
Egal ob PostGIS oder Rasdaman - am Ende werden alle Anfragen in SQL an die Datenbank weitergegeben. Wie schnell die Datenbank die Anfragen bearbeitet liegt dabei sehr stark an den Algorithmen, die im SQL verwendet wurden. Bei über 95% aller Beschwerden, dass die Datenbank zu langsam ist, liegt die Ursache an einer ungünstig gewählten SQL-Zusammenstellung.
Der Vortrag zeigt auf, wie der PostgreSQL-Planer SQL-Anfragen verarbeitet, was der Unterschied zwischen INNER und OUTER Joins ist und wie SQL-Anfragen analysiert werden können. Darüber hinaus gibt es Tips und Tricks was zur Behebung langsamer Ausführungsschritte eventuell unternommen werden könnte. Vieles, des hier gezeigten, lässt sich auch auf andere Datenbanksysteme übertragen.
Bei uns testen lauter Affen - Das Ende der BanensoftwareSAP SE
Wer hat den Teufelskreis aus Testing und Debugging noch nicht erlebt:
In zwei Wochen ist Release-Date und die Tester finden täglich neue Fehler.
Jeder Fehler führt zu einer Änderung im Programm.
Und jede Änderung kann selbst wieder Fehler verursachen und muss deshalb getestet werden...
Software-Fehler kosten die deutsche Wirtschaft bis zu 10 Mrd Euro im Jahr. Deshalb macht Testen derzeit ca. 20% der Kosten einer neuen Software aus, Tendenz steigen. Alleine für Java-Software sind das in Deutschland ca. 3,4 Mrd. Euro im Jahr. Diese Kosten entstehen hauptsächlich durch manuelles Testen bzw. manuelle Testfallerstellung. Der Automatisierungsgrad beim Testen liegt derzeit bei ca. 15%. Was wenn man automatisch Testen könnte? Und d.h. nicht manuell erstellte Tests (die will sowieso keiner erstellen und erst recht keiner pflegen) automatisch ablaufen lassen, sondern wirklich vollautomatisch Testen?
Monkey-Testing bezeichnet zufallsbasiertes Testen von Software über die Benutzeroberfläche, und findet vollautomatisch und kostengünstig Fehler. In diesem Vortrag zeige ich, wie jeder Anwesende mit ein paar Zeilen Code einen eigenen primitiven Affen zum automatischen Testen programmieren kann. Davon ausgehend zeige ich Ansätze und Konzepte, wie man diesen Affen (u.a. mit genetischen Algorithmen) immer weiter verbessern kann, bis er teilweise bessere Ergebnisse als menschliche Tester bringt. Dazu gibt es Demos und Erfahrungsberichte aus großen Projekten.
Datenzugriff mit dem Entity Framework muss nicht langsam sein. In diesem Vortrag lernen Sie typische Stolperfallen kennen und wie Sie diese umschiffen können
Ähnlich wie Funktionale Programmierung und mehr mit Scala (20)
1. from good ideas to great software
Funktionale Programmierung und mehr mit Scala
SwissLife IT-Weiterbildung, 10. Dezember 2014
Thomas Herrmann, 42ways UG
2. Prozedural vs. Funktional - Beispiel Quicksort
1. Wähle ein beliebiges Element (pivot) aus der Liste aus,
z. B. das Element am Anfang der Liste.
2. Teile den Rest der Liste in zwei Listen. Alle Elemente
kleiner oder gleich pivot kommen in die erste, alle
Elemente größer oder gleich pivot in die zweite Liste.
Nun ist pivot an der richtigen Position.
3. Führe den Algorithmus rekursiv für die beiden Teillisten
aus.
3. Prozedural vs. Funktional - Quicksort in C
void quicksort(int a[], int lower, int upper) {
int i;
if ( upper > lower ) {
i = split(a, lower, upper);
quicksort(a, lower, i - 1);
quicksort(a, i + 1, upper);
}
}
int split(int a[], int lower, int upper) {
int i, p, q, t;
p = lower + 1; q = upper;
pivot = a[lower];
while ( q >= p ) {
while ( a[p] < pivot )
p++ ;
while ( a[q] > pivot )
q-- ;
if ( q > p ) {
t = a[p]; a[p] = a[q]; a[q] = t;
}
}
t = a[lower]; a[lower] = a[q]; a[q] = t;
return q;
} Adapted from http://programminggeeks.com/c-code-for-quick-sort/
4. Prozedural vs. Funktional - Quicksort in Scala
def quicksort(list: List[Int]): List[Int] = {
list match {
case Nil => Nil
case x :: xs => quicksort(xs.filter(_ <= x)) ++
List(x) ++
quicksort(xs.filter(_ > x))
}
}
def l = List(2,8,3,1,7,0,9,5,4,6)
quicksort(l)
5. Prozedural vs. Funktional - Quicksort in Scala
def quicksort[T <% Ordered[T]](list: List[T]): List[T] = {
list match {
case Nil => Nil
case x :: xs => quicksort(xs.filter(_ <= x)) ++
List(x) ++
quicksort(xs.filter(_ > x))
}
}
8. Funktionale Programmierung
• Funktion ist “first class citizen"
• “Pure Functions” ohne Seiteneffekte / stateless
• Rekursion
• Higher order functions
• Typsysteme / Funktionale Datenstrukturen
• Strict vs. Lazy evaluation
9. Scala
• Entstanden 2003
• Sprache auf der Java Virtual Machine (JVM)
• Integration mit Java
• Objektorientiert und Funktional
• Sehr umfangreich / komplex
• Erweiterbar
10. Klassendefinition “Person” in Scala
class Person(val name: String, val birth: Date,
val sex: Sex, val profession: Profession)
11. Klassendefinition “Person” in Java
public class Person {
private String name;
private Date birth;
private Sex sex;
private Profession profession;
public Person(String name, Date birth, Sex sex,
Profession profession) {
this.name = name;
this.birth = birth;
this.sex = sex;
this.profession = profession;
}
public String getName { return name; }
public Date getBirth { return birth; }
public Sex getSex { return sex; }
public Profession getProfession { return profession; }
}
12. Rekursion in Scala
def fac(n: Int): Int = {
if (n == 0) 1
else n * fac(n-1)
}
Mathematische Definition:
0! = 1
n! = n * (n-1)!
13. Rekursion in Scala
// Der Euklidische Algorithmus zur Berechnung des größten
// gemeinsamen Teilers zweier natürlicher Zahlen m, n
// (m ≥ 0, n > 0).
def ggt(m: Int, n: Int): Int = {
if (n == 0) m
else ggt(n, m % n)
}
21. Currying - Funktionen zum Teil auswerten
// Diskontierung mit Zinssatz als Parameter
def diskont(zinsSatz: Double, wert: Double) =
wert * 1 / (1 + zinsSatz)
// Diskontierung mit festgelegten Zinssätzen
def diskont_0175: Double => Double = diskont(0.0175, _)
def diskont_0125: Double => Double = diskont(0.0125, _)
22. Allgemeine Higher Order Functions
def partial1[A,B,C](a: A, f: (A,B) => C): B => C =
b => f(a, b)
def curry[A,B,C](f: (A,B) => C): A => (B => C) =
a => b => f(a,b)
def uncurry[A,B,C](f: A => B => C): (A, B) => C =
(a, b) => f(a)(b)
def compose[A,B,C](f: B => C, g: A => B): A => C =
a => f(g(a))
27. Funktionale Datenstrukturen / Case Classes
abstract class BinTree[+A]
case object EmptyTree extends BinTree
case class Node[A](element: A,
left: BinTree[A],
right: BinTree[A]) extends BinTree[A]
def inOrder[A](t: BinTree[A]): List[A] = {
t match {
case EmptyTree => List()
case Node(e, l, r) => inOrder(l):::List(e):::inOrder(r)
}
}
29. Kleinste Zahl, die nicht in einer Liste vorkommt
// Inspired by "Pearls of functional algorithm design”
// by Richard Bird, Cambridge University Press, Chapter 1
def minfree(list: List[Int]): Int = {
Stream.from(1).dropWhile(list contains).head
}
def list1 = List(26, 9, 22, 3, 17, 13, 21, 25, 14, 15, 20, 7, 2,
24, 12, 8, 19, 11, 27, 6, 5, 23, 18, 1, 16, 4, 10)
minfree(list1)
def list2 = List(26, 9, 22, 3, 17, 13, 21, 25, 14, 15, 20, 7, 2,
24, 8, 19, 11, 27, 6, 5, 23, 18, 1, 16, 4, 10)
minfree(list2)
30. Sieb des Eratosthenes - Eine “unendliche” Liste
import scala.language.postfixOps
// Konzeptionell:
// 1. Schreibe alle natürlichen Zahlen ab 2 hintereinander auf.
// 2. Die kleinste nicht gestrichene Zahl in dieser Folge ist
// eine Primzahl. Streiche alle Vielfachen dieser Zahl.
// 3. Wiederhole Schritt 2 mit der kleinsten noch nicht
// gestrichenen Zahl.
def sieve(natSeq: Stream[Int]): Stream[Int] =
Stream.cons(natSeq.head,
sieve ((natSeq tail) filter
(n => n % natSeq.head != 0)) )
def primes = sieve(Stream from 2)
def firstNprimes(n: Int) = primes take n toList
31. Fazit
• Funktionale Programmierung ermöglicht einfachen,
wartbaren und parallelisierbaren Code
• Funktionale Programmierung bringt Flexibilität und neue
Abstraktionslevel
• Scala ermöglicht die Kombination objektorientierter und
funktionaler Programmierung auf der JVM
32. Literatur
Martin Odersky, Lex Spoon, Bill Venners:
Programming in Scala (artima)
Cay S. Horstmann:
Scala for the Impatient (Addison-Wesley)
Paul Chiusano, Rúnar Bjarnason:
Functional Programming in Scala (Manning)
Bruce A. Tate:
Seven Languages in Seven Weeks (Pragmatic
Programmers)
Ein kleines Beispiel zum Einstieg, das bereits einige Konzepte enthält.
Das Beispiel ist zwar (noch) nicht aus der Versicherungsbranche, allerdings ist das ein einfacher Algorithmus, den eigentlich jeder kennen oder zumindest verstehen sollte…
Die eigentliche Quicksort-Funktion ist ja noch sehr nahe an der Beschreibung des Algorithmus.
Die split-Funktion ist eher unübersichtlich. Dieses Beispiel ist aber immerhin bereits in zwei Funktionen unterteilt…
Erkennt man hier den Algorithmus? Ist der Code fehlerfrei?
Funktional sieht der Code beinahe so aus wie die Beschreibung des Algorithmus.
Es ist sehr leicht, die Korrektheit der Implementierung zu erkennen.
Die rekursiven Aufrufe (und der Filter) können parallelisiert werden.
Hier schon ein bisschen was erklären (case classes/pattern matching/funktionale/rekursion)
Ach ja, das geht natürlich mit jedem Datentyp, der eine Ordnung implementiert…
Funktionale Programmierung ist nicht neu!
LISP: Hauptsächlich KI
ML: statisch getypt / Typsysteme
Scheme (minimalistisch) und Common Lisp (komplex): Verbreitung von LISP
Haskell: Funktionale Programmierung “reine Lehre”
Scala
Clojure (LISP-Dialekt auf der JVM)
Letztendlich rühren die Vorteile mehr oder weniger alle aus dem Ansatz, Funktionen eher im mathematischen Sinn zu sehen und nicht zur Veränderung eines Zustands.
Ein paar für funktionale Programmierung typische Eigenschaften und Patterns.
Backbone von Twitter ist in Scala geschrieben
Objekt-Funktional
Sprache hat alle möglichen Sachen integriert, z. B. XML, Reguläre Ausdrücke etc.
-> Umfangreich / Komplex (Odersky-Buch hat ca. 800 Seiten!)
Erweiterbarkeit z. B. für DSLs durch Higher Order Functions (Beispiel untill später)
Erst mal ein wenig Objektorientierung und Bezug zu Java.
Durch Angabe der Attribute bei der Klassen-Deklaration bekommt man die private Member + getter und setter sowie einen entsprechenden Konstruktor “geschenkt”
In Java ist da schon deutlich mehr Boilerplate code zu schreiben…
Klassisches Beispiel für Rekursion ist die Fakultät. Der Code sieht praktisch aus wie die mathematische Definition.
Sowas geht natürlich auch in Java, C, mit ein wenig mehr boilerplate code…
Allerdings trifft man rekursive Funktionen in funktionalem Code sehr viel häufiger an.
Die Funktionsdefintion in Scala kann ausserhalb jeder Klassendefinition erfolgen.
Noch ein klassisches Beispiel, einfache Rekursion.
Diese Funktion ist tail-recursive, d. h. der Compiler kann daraus eine Schleife machen (Performance / Stackspace).
Funktionen können auch innerhalb anderer Funktionen definiert werden (also nicht nur innerhalb von Klassen).
Auch hier sieht man sehr schön, dass die Implementierung sehr nahe an der fachlichen Lösungsbeschreibung ist.
Auch wieder tail-recursive und daher vom Compiler zur Schleife gemacht.
Im Beispielcode ist noch ein Printen drin, da sieht man wie (und wie schnell) die Annäherung an die Lösung erfolgt.
Diese drei Funktionen haben das gleiche Rekursionsschema:
Bei 0 wird ein Wert zurückgegeben, sonst erfolgt der rekursive Aufruf mit n - 1, dessen Ergebnis dann in einem Berechnungsausdruck verarbeitet wird.
Durch Higher Order Functions ist es möglich, das Rekursionsschema zu verallgemeinern.
Unsere drei Funktionen werden nun durch einen Aufruf von myRecScheme erzeugt. Erstes Argument ist der Initialwert (Terminierungsfall), zweites Argument ein Lamda-Ausdruck, der die Verarbeitung des Rekursiven Aufrufs und des aktuellen Wertes zum Endergebnis definiert.
Wenn Parameter in der angegebenen Reihenfolge und nur ein Mal verwendet werden, kann man auch “_” schreiben.
Mit Hilfe von Higher Order Functions können auch Funktionen definiert werden, die aussehen und sich anfühlen wie native Sprachsyntax.
Das funktioniert, weil die “=> T” - Parameter call-by-name sind.
Stichwort: DSLs
Listen natürlicher Zahlen (Ranges) können sehr einfach erzeugt werden.
Für die Listen gibt es viele Funktionen, wie z. B. filter, contains, foreach, map, …
Mit zip können zwei Listen kombiniert werden (wie beim “Reißverschluss” == “zipper”).
map wendet eine Funktion auf jedes Listenelement an,
reduce erzeugt ein Ergebnis aus der Liste mit Hilfe einer Aggregatfunktion.
map und reduce werden oft kombiniert, um Daten erst aufzubereiten (map) und dann ein Ergebnis zu generieren (reduce).
Ein ganz typisches Pattern ist, eine Liste zu filtern, dann eine Funktion auf die Elemente anzuwenden (map) und deren Ergebnis dann zu aggregieren (reduce).
Die “for”-Expression (es gibt auch for-Schleifen, also “for (x <- xs) block”) in Scala ist sehr viel mächtiger als for-Schleifen in anderen Sprachen, da sie mehrere Sequenzen (also quasi geschachtelte Schleifen) gleichzeitig generieren und dabei auch direkt Bedingungen auswerten kann.
Das n-queens-Beispiel zeigt ganz gut, wie “einfach” man ein doch relativ komplexes Suchproblem in Scala implementieren kann. Wäre sicher interessant, das mal prozedural (in Java oder gar in C) zu implementieren….
Currying am Beispiel der Diskontierung, also mal ein Beispiel das auch bei Versicherungen relevant wäre…
Es ist zwar ziemlich trivial, zeigt aber das Prinzip (hoffentlich verständlich).
Hier ein paar allgemeine Higher Order Functions.
Interessant hierbei ist, dass die Implementierung sich direkt aus den Parametertypen ergibt, welche in der Instanziierung beliebig komplexe Datentypen sein können….
Die Sterbetafeln können von verschiedenen Parametern abhängen, die z. T. durch den Tarif, z. T. durch das versicherte Risiko (die VP) definiert sind. Letztlich interessiert aber in der Barwertformel (und an vielen anderen Stellen) nur die Abhängigkeit vom Alter.
Letztlich interessiert aber in der Barwertformel (und an vielen anderen Stellen) nur die Abhängigkeit vom Alter.
Daher erzeugen wir uns aus den komplexeren Sterbetafeln jeweils nur die altersabhängige qx-Funktion, die wir der Barwertfunktion dann als Parameter übergeben können.
Nachdem die qx-Funktion Tarif- und VP-abhängig erstellt wurde, kann der Barwert immer identisch aufgerufen werden.
Variationen / Abhängigkeiten wurden also “nach aussen” gezogen.
NB: Der aufmerksame Beobachter hat vielleicht gemerkt, dass die barwert-Funktion zwei Parameterlisten hat. Das liegt daran, dass die Abhängigkeit von der Zins-, qx- und spektren-Funktion ebenfalls per Currying aufgelöst werden kann.
Definition eines Binärbaumes mit Knotenwerten eines beliebigen Typs.
inOrder wandelt den Baum in eine Liste um, depth-first-Durchlauf.
Ein Stream erzeugt eine “unendliche” Liste von Werten. Berechnet werden immer nur so viele Werte, wie aus dem Stream abgefragt werden.
Um das kleinste Element einer Liste zu finden können wir mit Hilfe eines Streams einfach “alle” natürlichen Zahlen durchprobieren, bis wir die richtige gefunden haben.
Allerdings ist diese Implementierung natürlich sehr ineffizient…
Mit Hilfe von Streams können daher auch Algorithmen wie das Sieb des Eratosthenes direkt umgesetzt werden. Die Größe der Ergebnisliste ergibt sich ausschließlich durch das Abrufen der ersten n Primzahlen.