38
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 15:59:34 2019-01-22 1 [17]

Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Praktische Informatik 3: Funktionale ProgrammierungVorlesung 13 vom 22.01.19: Scala — Eine praktische Einführung

Christoph Lüth

Universität Bremen

Wintersemester 2018/19

15:59:34 2019-01-22 1 [17]

Page 2: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Fahrplan

I Teil I: Funktionale Programmierung im Kleinen

I Teil II: Funktionale Programmierung im Großen

I Teil III: Funktionale Programmierung im richtigen Leben

I Aktionen und Zustände

I Monaden als Berechnungsmuster

I Domänenspezifische Sprachen (DSLs)

I Scala — Eine praktische Einführung

I Rückblich & Ausblick

PI3 WS 18/19 2 [17]

Page 3: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Organisatorisches

I Anmeldung zur E-Klausur: ab Mitte der Woche

I Evaluation der Veranstaltung auf stud.ip: bitte teilnehmen!

PI3 WS 18/19 3 [17]

Page 4: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Heute: Scala

I A scalable language

I Rein objektorientiert

I Funktional

I Eine “JVM-Sprache”

I Seit 2004 von Martin Odersky, EPFL Lausanne(http://www.scala-lang.org/).

I Seit 2011 kommerziell durch Lightbend Inc. (formerly Typesafe)

PI3 WS 18/19 4 [17]

Page 5: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)

I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!

I RekursionI Endrekursion wird optimiert

I TypinferenzI Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 6: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)

I Mit Vorsicht benutzen!I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!

I RekursionI Endrekursion wird optimiert

I TypinferenzI Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 7: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!

I RekursionI Endrekursion wird optimiert

I TypinferenzI Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 8: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)

I while-Schleifen

I Unnötig!

I RekursionI Endrekursion wird optimiert

I TypinferenzI Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 9: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!I Rekursion

I Endrekursion wird optimiertI Typinferenz

I Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 10: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!

I RekursionI Endrekursion wird optimiert

I TypinferenzI Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 11: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!I Rekursion

I Endrekursion wird optimiert

I TypinferenzI Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 12: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!I Rekursion

I Endrekursion wird optimiertI Typinferenz

I Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 13: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?def gcdLoop(x : Long, y : Long) : Long = {

var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp

}return b

}

def gcd(x : Long, y : Long) : Long =i f (y == 0) x else gcd (y , x % y)

I Variablen, veränderlich (var)I Mit Vorsicht benutzen!

I Werte, unveränderlich (val)I while-Schleifen

I Unnötig!I Rekursion

I Endrekursion wird optimiertI Typinferenz

I Mehr als Java, weniger als Haskell

I Interaktive Auswertung

PI3 WS 18/19 5 [17]

Page 14: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 15: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I Klassenparameter

I Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 16: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)

I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 17: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )

I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 18: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und Methoden

I Methoden, Syntax fürMethodenanwendung

I override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 19: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

Methodenanwendung

I override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 20: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)

I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 21: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I Overloading

I OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 22: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I OverloadingI Operatoren

I Companion objects (object)

PI3 WS 18/19 6 [17]

Page 23: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala am Beispiel: 02-Rational-1.scalaWas sehen wir hier?class Rational (n: Int , d: Int ) {

require (d != 0)

private val g = gcd(n. abs , d. abs)val numer = n / gval 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)

}

I KlassenparameterI Konstruktoren (this)I Klassenvorbedingungen ( require )I private Werte und MethodenI Methoden, Syntax für

MethodenanwendungI override (nicht optional)I OverloadingI OperatorenI Companion objects (object)

PI3 WS 18/19 6 [17]

Page 24: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Algebraische Datentypen: 03-Expr.scalaWas sehen wir hier?abstract class Exprcase class Var(name: String) extends Exprcase class Num (num: Double) extends Exprcase class Plus ( l e f t : Expr , r ight : Expr)

extends Exprcase class Minus ( l e f t : Expr , r ight : Expr)

extends Exprcase class Times ( l e f t : Expr , r ight : Expr)

extends Exprcase class Div ( l e f t : Expr , r ight : Expr) extends

Expr

// Evaluating an expressiondef eval (expr : Expr) : Double = expr match {

case v : Var ⇒ 0 // Variables evaluate to 0case Num(x) ⇒ xcase 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) ))

I case class erzeugtI Factory-Methode für

KonstruktorenI Parameter als implizite valI abgeleitete Implementierung für

toString , equalsI . . . und pattern matching (match)

I Pattern sindI case 4 ⇒ LiteraleI case C(4) ⇒ KonstruktorenI case C(x) ⇒ VariablenI case C(\_)⇒ WildcardsI case x: C ⇒ getypte patternI case C(D(x: T, y), 4) ⇒

geschachtelt

PI3 WS 18/19 7 [17]

Page 25: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Algebraische Datentypen: 03-Expr.scalaWas sehen wir hier?abstract class Exprcase class Var(name: String) extends Exprcase class Num (num: Double) extends Exprcase class Plus ( l e f t : Expr , r ight : Expr)

extends Exprcase class Minus ( l e f t : Expr , r ight : Expr)

extends Exprcase class Times ( l e f t : Expr , r ight : Expr)

extends Exprcase class Div ( l e f t : Expr , r ight : Expr) extends

Expr

// Evaluating an expressiondef eval (expr : Expr) : Double = expr match {

case v : Var ⇒ 0 // Variables evaluate to 0case Num(x) ⇒ xcase 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) ))

I case class erzeugtI Factory-Methode für

KonstruktorenI Parameter als implizite valI abgeleitete Implementierung für

toString , equalsI . . . und pattern matching (match)

I Pattern sindI case 4 ⇒ LiteraleI case C(4) ⇒ KonstruktorenI case C(x) ⇒ VariablenI case C(\_)⇒ WildcardsI case x: C ⇒ getypte patternI case C(D(x: T, y), 4) ⇒

geschachtelt

PI3 WS 18/19 7 [17]

Page 26: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Implementierung algebraischer Datentypen

Haskell:

data T = C1 | . . . | Cn

I Ein Typ TI Konstruktoren erzeugen Datentyp

Scala:T

C1�

. . . Cn

-

I Varianten als SubtypenI Problem und Vorteil:

ErweiterbarkeitI sealed verhindert Erweiterung

PI3 WS 18/19 8 [17]

Page 27: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Implementierung algebraischer Datentypen

Haskell:

data T = C1 | . . . | Cn

I Ein Typ TI Konstruktoren erzeugen Datentyp

Scala:T

C1�

. . . Cn

-

I Varianten als SubtypenI Problem und Vorteil:Erweiterbarkeit

I sealed verhindert Erweiterung

PI3 WS 18/19 8 [17]

Page 28: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Das Typsystem

Das Typsystem behebt mehrere Probleme von Java:

I Werte vs. Objekte

I Scala vs. Java

I NULL references

PI3 WS 18/19 9 [17]

Page 29: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Vererbungshierarchie

Quelle: Odersky, Spoon, Venners: Programming in Scala

PI3 WS 18/19 10 [17]

Page 30: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Parametrische Polymorphie

I Typparameter (wie in Haskell, Generics in Java), Bsp. List [T]

I Problem: Vererbung und Polymorphie

I Ziel: wenn S < T, dann List [S] < List [T]

I Does not work — 04-Ref.hs

I Warum?

I Funktionsraum nicht monoton im ersten Argument

I Sei X ⊆ Y , dann Z −→ X ⊆ Z −→ Y , aber X −→ Z 6⊆ Y −→ Z

I Sondern Y −→ Z ⊆ X −→ Z

PI3 WS 18/19 11 [17]

Page 31: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Parametrische Polymorphie

I Typparameter (wie in Haskell, Generics in Java), Bsp. List [T]

I Problem: Vererbung und Polymorphie

I Ziel: wenn S < T, dann List [S] < List [T]

I Does not work — 04-Ref.hs

I Warum?

I Funktionsraum nicht monoton im ersten Argument

I Sei X ⊆ Y , dann Z −→ X ⊆ Z −→ Y , aber X −→ Z 6⊆ Y −→ Z

I Sondern Y −→ Z ⊆ X −→ Z

PI3 WS 18/19 11 [17]

Page 32: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Typvarianz

class C[+T]I KovariantI Wenn S < T, dann

C[S] < C[T]I Parametertyp T

nur imWertebereich vonMethoden

class C[T]I RigideI Kein SubtypingI Parametertyp T

kann beliebigverwendet werden

class C[−T]I KontravariantI Wenn S < T, dann

C[T] < C[S]I Parametertyp T

nur imDefinitionsbereichvon Methoden

Beispiel:

class Function[−S, +T] {def apply(x :S) : T}

PI3 WS 18/19 12 [17]

Page 33: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Traits: 05-Funny.scala

Was sehen wir hier?

I Trait (Mix-ins): abstrakte Klassen, Interfaces; Haskell: TypklassenI „Abstrakte Klassen ohne Konstruktur“I Unterschied zu Klassen:

I Mehrfachvererbung möglichI Keine feste Oberklasse (super dynamisch gebunden)I Nützlich zur Strukturierung (Aspektorientierung)

I Nützlich zur Strukturierung:

thin interface + trait = rich interface

Beispiel: 05-Ordered.scala, 05-Rational.scala

PI3 WS 18/19 13 [17]

Page 34: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

More TraitsI Ad-Hoc Polymorphie mit TraitsI Typklasse:

trait Show[T] {def show(value : T) : String

}

I Instanz:

implicit object ShowInt extends Show[ Int ] {def show(value : Int ) = value . toString

}

I Benutzung:

def print [T]( value : T)( implicit show: Show[T])= {print ln (show.show(value)) ;

}

PI3 WS 18/19 14 [17]

Page 35: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Was wir ausgelassen haben. . .

I Komprehension (nicht nur für Listen)

I Gleichheit: == (final), equals (nicht final), eq (Referenzen)

I string interpolation

I Implizite Parameter und Typkonversionen

I Nebenläufigkeit (Aktoren, Futures)

I Typsichere Metaprogrammierung

I Das simple build tool sbt

I Der JavaScript-Compiler scala . js

PI3 WS 18/19 15 [17]

Page 36: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Schlammschlacht der Programmiersprachen

Haskell Scala JavaKlassen und Objekte - + +Funktionen höherer Ordnung + + -Typinferenz + (+) -Parametrische Polymorphie + + +Ad-hoc-Polymorphie + + -Typsichere Metaprogrammierung + + -

Alle: Nebenläufigkeit, Garbage Collection, FFI

PI3 WS 18/19 16 [17]

Page 37: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Scala — Die Sprache

I Objekt-orientiert:

I Veränderlicher, gekapselter Zustand

I Subtypen und Vererbung

I Klassen und Objekte

I Funktional:

I Unveränderliche Werte

I Parametrische und Ad-hoc Polymorphie

I Funktionen höherer Ordnung

I Hindley-Milner Typinferenz

PI3 WS 18/19 17 [17]

Page 38: Praktische Informatik 3 (WS 2018/19)cxl/lehre/pi3.ws18/lectures/slides-1… · PraktischeInformatik3:FunktionaleProgrammierung Vorlesung13vom22.01.19:Scala—EinepraktischeEinführung

Beurteilung

I Vorteile:I Funktional programmieren, in der Java-Welt lebenI Gelungene Integration funktionaler und OO-KonzepteI Sauberer Sprachentwurf, effiziente Implementierung, reiche Büchereien

I Nachteile:I Manchmal etwas zu vielI Entwickelt sich ständig weiterI One-Compiler-Language, vergleichsweise langsam

I Mehr Scala?I Besuchen Sie auch Reaktive Programmierung (SoSe 2017)

PI3 WS 18/19 18 [17]