Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom 22.01.13: Scala — When Java meets Functional
Christoph Lüth Universität Bremen Wintersemester 2012/13
Rev. 1999 1 [16]
Organisatorisches
I Fachgespräche:
IVorschlag Termine: 01.02., 11.02.
IDritter Termin ggf. 12.02. (nach Bedarf)
I Evaluation:
IEs wird einenOnline-Fragebogengeben (unter Stud.IP)
IBitteausfüllen!
2 [16]
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 Effizienzaspekte
I Eine Einführung in Scala
I Rückblich & Ausblick
3 [16]
Heute: Scala
I Ascalable language
I Multi-paradigma-Sprache
I “Lebt im Java-Ökosystem”
I Martin Odersky, ETH Lausanne
I http://www.scala-lang.org/
4 [16]
Scala am Beispiel: 01-GCD.scala
Was sehen wir hier?
I Variablen, veränderlich
I Werte, unveränderlich
I while-Schleifen
I Rekursion —einfache Endrekursion wird optimiert
I Typinferenz — mehr als Java, weniger als Haskell
5 [16]
Scala am Beispiel: 02-Rational.scala
Was sehen wir hier?
I Klassenparameter
I this
I Methoden, Syntax für Methodenanwendung
I override(nicht optional) I private Werte und Methoden I Klassenvorbedingunge (require) I Overloading
I Operatoren
6 [16]
Algebraische Datentypen: 03-Expr.scala
Was sehen wir hier?
I case classerzeugt
I Factory-Methode für Konstruktoren
I Parameter als impliziteval
I abgeleitete Implementierung fürtoString,equals
I . . . und pattern matching I Pattern sind
I Konstanten
I Konstruktoren
I Variablen
I Wildcards
I getypte pattern
7 [16]
Implementierung algebraischer Datentypen
Haskell:
data T =C1 |. . . | Cn
I Ein TypT
I Konstruktoren erzeugen Datentyp
Scala:
T C1
. . . Cn
-
IVarianten alsSubtypen IProblem und Vorteil:
Erweiterbarkeit
Isealedverhindert Erweiterung
8 [16]
Das Typsystem
Behandelt:
I Werte vs. Objekte
I Scala vs. Java
I NULLreferences
9 [16]
Vererbungshierarchie
Quelle: Odersky, Spoon, Venners:Programming in Scala
10 [16]
Parametrische Polymorphie
I Typparameter (wie in Java, Haskell), Bsp.List[T]
I Problem: Vererbung und Polymorphie
I Ziel: wennS<T, dannList[S]<List[T]
I Problem:Ref.hs
I Warum?
I Funktionsraum nicht monoton im ersten Argument
I SeiX⊆Y, dannZ−→X⊆Z−→Y, aberX−→Z6⊆Y−→Z
11 [16]
Typvarianz
class C[+T]
I Kovariant I S<T, dann
C[S]<C[T]
I ParameterTnicht in Def.bereich
class C[T]
I Rigide I Kein Subtyping I ParameterTkann
beliebig verwendet werden
class C[-T]
I Kontravariant I S<T, dann
C[T]<C[S]
I ParameterTnicht in Wertebereich
Beispiel:
class Function[-S, +T] { def apply(x:S) : T }
12 [16]
Traits: 04-Funny.scala
Was sehen wir hier?
I Traits(Mix-ins): abstrakte Klassen, Interfaces; Haskell: Typklassen I Unterschied zu Klassen:
I Keine Parameter
I Keine feste Oberklasse (superdynamisch gebunden) I Nützlich zur Strukturierung:
thin interface+trait=rich interface Beispiel:04-Ordered.scala,04-Rational.scala
13 [16]
Was wir ausgelassen haben. . .
I Komprehension (nicht nur für Listen)
I Gleichheit (==,equals)
I Implizite Parameter und Typkonversionen
I Nativer XML Support
I Nebenläufigkeit (Aktoren)
14 [16]
Scala — Die Sprache
I Objekt-orientiert:
I Veränderlicher, gekapselterZustand
I Subtypen und Vererbung
I Klassen und Objekte I Funktional:
I UnveränderlicheWerte
I Polymorphie
I Funktionen höherer Ordnung
15 [16]
Beurteilung
I Vorteile:
IFunktional programmieren, in der Java-Welt leben
IGelungene Integration funktionaler und OO-Konzepte
ISauberer Sprachentwurf, effiziente Implementierung, reiche Büchereien I Nachteile:
IManchmal etwaszuviel
IEntwickelt sich ständig weiter
IOne-Compiler-Language, vergleichsweise langsam
16 [16]