Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom : Scala Eine praktische Einführung

Ähnliche Dokumente
Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom : Scala Eine praktische Einführung

Programmierparadigmen und Sprachen

Scala. Funktionale (Zustandslose) Objekte

Scala LIGHTNING TALK 03

Vererbung und Traits

Ausdrücke in Scala. Funktionale Programmierung. Christoph Knabe FB VI

Die Programmiersprache Scala

Scala: Klassen, Methoden und Objekte. von Simon Lerch

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom : Monaden als Berechnungsmuster

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Kopieren und Vergleichen

Programmieren in Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Kopieren und Vergleichen

6. Globalübung (zu Übungsblatt 8)

Programmieren in Java

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Polymorphie. 15. Java Objektorientierung II

Polymorphie. 15. Java Objektorientierung II

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Praktikum. SEP: Java-Programmierung WS 2018/19. Modularisierung. Thomas Lemberger und Martin Spießl

Algorithmen und Datenstrukturen

Gliederung der Folien

Software Entwicklung 1

Algorithmen und Datenstrukturen II

Scala. Abstrakte Elemente. Jevgeni Zelenkov. HM

Vorkurs Informatik WiSe 15/16

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Grundlegende Datentypen

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Die abstrakte Klasse Expression:

Unveränderliche Klassen

Grundlegende Datentypen

Vorlesung Objektorientierte Programmierung WS 2013/2014 / Folie 620

Inhaltsverzeichnis. Lothar Piepmeyer. Grundkurs funktionale Programmierung mit Scala ISBN:

Grundlegende Datentypen

Kapitel 15. Virtuelle Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Erste Java-Programme (Java Wiederholung & Vererbung)

14 Abstrakte Klassen, finale Klassen, Interfaces

Funktionale Programmierung Grundlegende Datentypen

Vererbung und Polymorphie

Java 8. Johannes Hellrich, Erik Fäßler. Oberseminar

19. Vererbung und Polymorphie

III.1 Prinzipien der funktionalen Programmierung - 1 -

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/ / 861

Objekt-Funktionale Programmierung. am Beispiel von SCALA. Thorsten Jolitz

Methoden. (Softwareentwicklung II (IB)) Prof. Dr. Oliver Braun. Letzte Änderung: :40. Methoden 1/44

Einführung in die Programmiersprache Java II

Softwareentwicklung II (IB) Methoden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Johannes Unterstein - TINF16 - Java - Sommersemester 2017 JAVA. Weiterführende Spracheigenschaften

Klassen als Objekte. Smalltalk vs. Objective-C. Self-Nachrichten an Klassen in Objective-C. Klassen als Objekte. Smalltalk: Everything is an object

Inhaltsverzeichnis. 4.9 Aufgaben... 63

Web-Techniken Einführung in JavaScript

Java Einführung Vererbung und Polymorphie. Kapitel 13

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

Java-Grundkurs für Wirtschaftsinformatiker

Theorie zu Übung 8 Implementierung in Java

Objektorientierte Programmierung

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Sprachen

7. Vererbung und Polymorphie

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Einstieg in die Informatik mit Java

4. Vererbung Die Klasse Object. Die Klasse Object

(Building) Flexible Functional Programming Interfaces. Von Amos Treiber

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Einstieg in die Informatik mit Java

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Informatik II Übung 6

Java I Vorlesung 6 Referenz-Datentypen

Kapitel 4: Klassen und Unterklassen

Programmierung Nachklausurtutorium

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Grundlagen der Programmierung 3 A

Java Idioms. Basic und Advanced Java Coding Style. Prof. Dr. Nikolaus Wulff

Einführung in die Programmierung

Wie schreibe ich ein Powerbook

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

Programmieren in Java -Eingangstest-

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Funktionale Programmierung

Informatik II Musterlösung

Grundlagen der Programmierung 3 A

Transkript:

15:59:34 2019-01-22 1 [17] Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom 22.01.19: Scala Eine praktische Einführung Christoph Lüth Universität Bremen Wintersemester 2018/19

PI3 WS 18/19 2 [17] Fahrplan Teil I: Funktionale Programmierung im Kleinen Teil II: Funktionale Programmierung im Großen Teil III: Funktionale Programmierung im richtigen Leben Aktionen und Zustände Monaden als Berechnungsmuster Domänenspezifische Sprachen (DSLs) Scala Eine praktische Einführung Rückblich & Ausblick

PI3 WS 18/19 3 [17] Organisatorisches Anmeldung zur E-Klausur: ab Mitte der Woche Evaluation der Veranstaltung auf stud.ip: bitte teilnehmen!

PI3 WS 18/19 4 [17] Heute: Scala A scalable language Rein objektorientiert Funktional Eine JVM-Sprache Seit 2004 von Martin Odersky, EPFL Lausanne (http://www.scala-lang.org/). Seit 2011 kommerziell durch Lightbend Inc. (formerly Typesafe)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala Variablen, veränderlich (var) def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b Variablen, veränderlich (var) Mit Vorsicht benutzen! def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b Variablen, veränderlich (var) Mit Vorsicht benutzen! Werte, unveränderlich (val) def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b Variablen, veränderlich (var) Mit Vorsicht benutzen! Werte, unveränderlich (val) while-schleifen def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b Variablen, veränderlich (var) Mit Vorsicht benutzen! Werte, unveränderlich (val) while-schleifen Unnötig! def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b Variablen, veränderlich (var) Mit Vorsicht benutzen! Werte, unveränderlich (val) while-schleifen Unnötig! Rekursion Endrekursion wird optimiert def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y)

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y) Variablen, veränderlich (var) Mit Vorsicht benutzen! Werte, unveränderlich (val) while-schleifen Unnötig! Rekursion Endrekursion wird optimiert Typinferenz Mehr als Java, weniger als Haskell

PI3 WS 18/19 5 [17] Scala am Beispiel: 01-GCD.scala def gcdloop(x : Long, y : Long) : Long = { var a = x var b = y while (a!= 0) { val temp = a a = b % a b = temp return b def gcd(x : Long, y : Long) : Long = i f (y == 0) x else gcd (y, x % y) Variablen, veränderlich (var) Mit Vorsicht benutzen! Werte, unveränderlich (val) while-schleifen Unnötig! Rekursion Endrekursion wird optimiert Typinferenz Mehr als Java, weniger als Haskell Interaktive Auswertung

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) Klassenparameter private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g Klassenparameter Konstruktoren (this) def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) private Werte und Methoden def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) private Werte und Methoden Methoden, Syntax für Methodenanwendung override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) private Werte und Methoden Methoden, Syntax für Methodenanwendung override (nicht optional) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) private Werte und Methoden Methoden, Syntax für Methodenanwendung override (nicht optional) Overloading override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) private Werte und Methoden Methoden, Syntax für Methodenanwendung override (nicht optional) Overloading Operatoren private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b)

PI3 WS 18/19 6 [17] Scala am Beispiel: 02-Rational-1.scala class Rational(n: Int, d: Int ) { require (d!= 0) private val g = gcd(n. abs, d. abs) val numer = n / g val denom = d / g def this (n: Int ) = this (n, 1) def add(that : Rational) : Rational = new Rational( numer that.denom + that.numer denom, denom that.denom ) override def tostring = numer +"/"+ denom private def gcd(a: Int, b: Int ) : Int = i f (b == 0) a else gcd(b, a % b) Klassenparameter Konstruktoren (this) Klassenvorbedingungen ( require ) private Werte und Methoden Methoden, Syntax für Methodenanwendung override (nicht optional) Overloading Operatoren Companion objects (object)

PI3 WS 18/19 7 [17] Algebraische Datentypen: 03-Expr.scala abstract class Expr case class Var(name: String ) extends Expr case class Num (num: Double) extends Expr case class Plus ( left : Expr, right : Expr) extends Expr case class Minus ( left : Expr, right : Expr) extends Expr case class Times ( left : Expr, right : Expr) extends Expr case class Div ( left : Expr, right : Expr) extends Expr // Evaluating an expression def eval (expr : Expr) : Double = expr match { case v : Var 0 // Variables evaluate to 0 case Num(x) x case Plus(e1, e2) eval (e1) + eval (e2) case Minus(e1, e2) eval (e1) eval (e2) case Times(e1, e2) eval (e1) eval (e2) case Div(e1, e2) eval (e1) / eval (e2) val e = Times(Num(12), Plus(Num(2.3),Num(3.7) ))

PI3 WS 18/19 7 [17] Algebraische Datentypen: 03-Expr.scala abstract class Expr case class Var(name: String ) extends Expr case class Num (num: Double) extends Expr case class Plus ( left : Expr, right : Expr) extends Expr case class Minus ( left : Expr, right : Expr) extends Expr case class Times ( left : Expr, right : Expr) extends Expr case class Div ( left : Expr, right : Expr) extends Expr // Evaluating an expression def eval (expr : Expr) : Double = expr match { case v : Var 0 // Variables evaluate to 0 case Num(x) x case Plus(e1, e2) eval (e1) + eval (e2) case Minus(e1, e2) eval (e1) eval (e2) case Times(e1, e2) eval (e1) eval (e2) case Div(e1, e2) eval (e1) / eval (e2) val e = Times(Num(12), Plus(Num(2.3),Num(3.7) )) case class erzeugt Factory-Methode für Konstruktoren Parameter als implizite val abgeleitete Implementierung für tostring, equals... und pattern matching (match) Pattern sind case 4 Literale case C(4) Konstruktoren case C(x) Variablen case C(\_) Wildcards case x: C getypte pattern case C(D(x: T, y), 4) geschachtelt

PI3 WS 18/19 8 [17] Implementierung algebraischer Datentypen Haskell: data T = C1... Cn Scala: C 1 T... C n Ein Typ T Konstruktoren erzeugen Datentyp Varianten als Subtypen Problem und Vorteil:

PI3 WS 18/19 8 [17] Implementierung algebraischer Datentypen Haskell: data T = C1... Cn Scala: C 1 T... C n Ein Typ T Konstruktoren erzeugen Datentyp Varianten als Subtypen Problem und Vorteil: Erweiterbarkeit sealed verhindert Erweiterung

PI3 WS 18/19 9 [17] Das Typsystem Das Typsystem behebt mehrere Probleme von Java: Werte vs. Objekte Scala vs. Java NULL references

PI3 WS 18/19 10 [17] Vererbungshierarchie Quelle: Odersky, Spoon, Venners: Programming in Scala

PI3 WS 18/19 11 [17] Parametrische Polymorphie Typparameter (wie in Haskell, Generics in Java), Bsp. List [T] Problem: Vererbung und Polymorphie Ziel: wenn S < T, dann List [S] < List[T] Does not work 04-Ref.hs

PI3 WS 18/19 11 [17] Parametrische Polymorphie Typparameter (wie in Haskell, Generics in Java), Bsp. List [T] Problem: Vererbung und Polymorphie Ziel: wenn S < T, dann List [S] < List[T] Does not work 04-Ref.hs Warum? Funktionsraum nicht monoton im ersten Argument Sei X Y, dann Z X Z Y, aber X Z Y Z Sondern Y Z X Z

PI3 WS 18/19 12 [17] Typvarianz class C[+T] Kovariant Wenn S < T, dann C[S] < C[T] Parametertyp T nur im Wertebereich von Methoden Beispiel: class C[T] Rigide Kein Subtyping Parametertyp T kann beliebig verwendet werden class C[ T] Kontravariant Wenn S < T, dann C[T] < C[S] Parametertyp T nur im Definitionsbereich von Methoden class Function[ S, +T] { def apply(x :S) : T

PI3 WS 18/19 13 [17] Traits: 05-Funny.scala Trait (Mix-ins): abstrakte Klassen, Interfaces; Haskell: Typklassen Abstrakte Klassen ohne Konstruktur Unterschied zu Klassen: Mehrfachvererbung möglich Keine feste Oberklasse (super dynamisch gebunden) Nützlich zur Strukturierung (Aspektorientierung) Nützlich zur Strukturierung: thin interface + trait = rich interface Beispiel: 05-Ordered.scala, 05-Rational.scala

PI3 WS 18/19 14 [17] More Traits Ad-Hoc Polymorphie mit Traits Typklasse: trait Show[T] { def show( value : T) : String Instanz: implicit object ShowInt extends Show[ Int ] { def show(value : Int ) = value. tostring Benutzung: def print [T]( value : T)( implicit show: Show[T])= { println (show.show( value)) ;

PI3 WS 18/19 15 [17] Was wir ausgelassen haben... Komprehension (nicht nur für Listen) Gleichheit: == (final), equals (nicht final), eq (Referenzen) string interpolation Implizite Parameter und Typkonversionen Nebenläufigkeit (Aktoren, Futures) Typsichere Metaprogrammierung Das simple build tool sbt Der JavaScript-Compiler scala. js

PI3 WS 18/19 16 [17] Schlammschlacht der Programmiersprachen Haskell Scala Java Klassen und Objekte - + + Funktionen höherer Ordnung + + - Typinferenz + (+) - Parametrische Polymorphie + + + Ad-hoc-Polymorphie + + - Typsichere Metaprogrammierung + + - Alle: Nebenläufigkeit, Garbage Collection, FFI

PI3 WS 18/19 17 [17] Scala Die Sprache Objekt-orientiert: Veränderlicher, gekapselter Zustand Subtypen und Vererbung Klassen und Objekte Funktional: Unveränderliche Werte Parametrische und Ad-hoc Polymorphie Funktionen höherer Ordnung Hindley-Milner Typinferenz

PI3 WS 18/19 18 [17] Beurteilung Vorteile: Funktional programmieren, in der Java-Welt leben Gelungene Integration funktionaler und OO-Konzepte Sauberer Sprachentwurf, effiziente Implementierung, reiche Büchereien Nachteile: Manchmal etwas zu viel Entwickelt sich ständig weiter One-Compiler-Language, vergleichsweise langsam Mehr Scala? Besuchen Sie auch Reaktive Programmierung (SoSe 2017)