Praktische Informatik 3: Einführung in die Funktionale Programmierung
Vorlesung vom 02.02.2011: The Next Big Thing — Scala
Christoph Lüth & Dennis Walter Universität Bremen Wintersemester 2010/11
Rev. 1368 1 [21]
Fahrplan
I Teil I: Funktionale Programmierung im Kleinen
I Teil II: Funktionale Programmierung im Großen
I Teil III: Funktionale Programmierung im richtigen Leben
IEffizient Funktional Programmieren
IFallstudie: Kombinatoren
IEine Einführung in Scala
IRückblich & Ausblick
2 [21]
Scala
IAscalable language
IMulti-paradigm language: funktional + oobjektorientiert
I„Lebt im Java-Ökosystem“
IMartin Odersky, ETH Lausanne
Ihttp://www.scala-lang.org/
3 [21]
Scala — Die Sprache
I Objekt-orientiert:
IVeränderlicher, gekapselterZustand
IKlassen und Objekte
ISubtypen und Vererbung I Funktional:
IAlgebraische Datentypen
IUnveränderlicheWerte
IParametrische Polymorphie
IFunktionen höherer Ordnung
4 [21]
Scala ist skalierbar
I„A language that grows on you.“
IStatt fertiger Sprache mit vielen KonstruktenRahmenwerkzur Implementation eigener Konstrukte:
IEinfache Basis
IFlexible Syntax
IFlexibles Typsystem
INachteil: Easy to learn but hard to master.
IEinfach zu benutzen:
ILeichtgewichtig durch Typinferenz und Interpreter
5 [21]
Durchgängige Objektorientierung
I Allesin Scala ist ein Objekt
IKeineprimitiven Typen
I Operatoren sind Methoden
IBeliebig überladbar
I Keinstatic, sondern Singleton-Objekte (object)
I Beispiel:Rational.scala
6 [21]
Werte
IVeränderlicheVariablenvar, unveränderlicheWerteval
IZuweisung anWerte nicht erlaubt
IDadurch unveränderliche Objekte−→referentielle Transparenz I“Unreine” Sprache
Ilazy val: wird nach Bedarf ausgewertet.
ISonderbehandlung vonEndrekursionfür bessere Effizienz
IDamiteffizientefunktionale Programmierung möglich
IBeispiel:Gcd.scala
7 [21]
Funktionale Aspekte
I Listenmit pattern matching
I Funktionenhöherer Ordnung
I Listenkomprehension
I Beispiel:Queens.scala
8 [21]
Algebraische Datentypen
ICase Classes
IKonzise Syntax für Konstruktoren:factory methods, keinnew
IParameter werden zuval-Feldern
IPattern Match mitSelektoren
IDisjunkte Vereinigung durch Vererbung
IBeispiel:Expr.scala
9 [21]
Algebraische Datentypen und Vererbung
I Algebraische Datentypen könnenerweitertwerden.
I BeispielExpr:
c a s e c l a s s UnOp ( op : S t r i n g , e : E x p r ) e x t e n d s E x p r
I Vorteil:flexibel I Nachteil: Fehleranfällig
I Verbieten der Erweiterung:sealed classes
s e a l e d a b s t r a c t c l a s s E x p r . . .
10 [21]
Scala: Klassenhierarchie
11 [21]
Polymorphie und Subtypen
I Generische Typen (Scala)∼=Parametrische Polymorphie (Haskell)
IIn Scala besser als in Java wegen Typinferenz
I Problem mit generischen Typen und Polymorphie:Varianz
IGegebenList [T]
IIstList [ String ] <List [AnyRef]?
IGilt das immer? Nein!
12 [21]
Typvarianz
Gegeben folgende Klasse:
c l a s s C e l l [ T ] ( i n i t : T) { p r i v a t e v a r c u r r = i n i t d e f g e t = c u r r
d e f s e t ( x : T) = { c u r r = x } }
Problem: IstCell [ String ] <Cell [Any]?
v a l c1 =new C e l l [ S t r i n g ] ( " a b c " ) v a l c2 : C e l l [ Any ] = c1
c2 . s e t ( 1 )
v a l s : S t r i n g = c1 . g e t
Also:Cell [ String ]keinUntertyp vonCell [Any]
13 [21]
Java: das gleiche Problem
Gegeben:
S t r i n g [ ] a1 ={ " a b c " } ; O b j e c t [ ] a2 = a1 ; a2 [ 0 ]=new I n t e g e r ( 1 ) ; S t r i n g s = a1 [ 0 ] ; Bei AusführungLaufzeitfehler:
# javac Covariance.java
# java Covariance
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer at Covariance.main(Covariance.java:8)
14 [21]
Das Problem: Kontravarianz vs. Kovarianz
IProblem ist Typ vonset : T=>Cell[T]=>()
INichtvarund Zuweisung IKovariant:
IRechts des Funktionspfeils (Resultat)
IErhält Subtypenbeziehung IKontravariant:
ILinks des Funktionspfeils (Argument)
IKehrt Subtypenbeziehung
IPositionder Typvariablen bestimmtVarianz:
IGegeben MengenA,B,XmitA⊆B
IDann istX→A⊆X→B
IAbernichtA→X⊆B→X
IAnnotation der Varianz:Set[+T], Map[−T]
15 [21]
Beschränkte Polymorphie
Gegeben Listen:
a b s t r a c t c l a s s L i s t [+T ]
c a s e o b j e c t N i l e x t e n d s L i s t [ N o t h i n g ]
c a s e c l a s s ::[ T ] ( hd : T , t l : L i s t [ T ] ) e x t e n d s L i s t [ T ] I Problem: AnList [T]kann nurTgehängt werden
I Wünschenswert: beliebiger Untertyp vonT
I Lösung:bounded polymorphism
c a s e c l a s s :: [ U>: T ) ( hd : U , t l : L i s t [ T ] )
e x t e n d s L i s t [ T ]
16 [21]
Traits
t r a i t O r d e r e d [ A ] { d e f cmp ( a : A ) : I n t
d e f < ( a : A ) : B o o l e a n = (t h i s cmp a ) < 0 d e f > ( a : A ) : B o o l e a n = (t h i s cmp a ) > 0 d e f ≤ ( a : A ) : B o o l e a n = (t h i s cmp a ) ≤0 d e f ≥ ( a : A ) : B o o l e a n = (t h i s cmp a ) ≥0 d e f cmpTo ( t h a t : A ) : I n t =cmp ( t h a t ) }
c l a s s R a t i o n a l e x t e n d s O r d e r e d [ R a t i o n a l ] { . . .
d e f cmp ( r : R a t i o n a l ) =
(t h i s. numer ∗ r . denom ) − ( r . numer∗ t h i s. denom )
IMächtiger als Interfaces (Java): kann Implementierung enthalten IMächtiger als abtrakte Klassen: Mehrfachvererbung
IMächtiger als Typklassen (Haskell): mehr als ein Typ-Parameter
17 [21]
Weitere Besonderheiten: apply
I applyerlaubt Definition von Factory-Methoden und mehr:
I f ( i )wird syntaktisch zuf . apply( i )
I Anderes Beispiel: Selektion ausarray, Funktionen
18 [21]
Weitere Besonderheiten: Extraktoren
o b j e c t E M a i l {
d e f a p p l y ( u s e r : S t r i n g , domain : S t r i n g ) = u s e r+ "@"+ domain
d e f u n a p p l y ( s t r : S t r i n g ) : O p t i o n [ ( S t r i n g , S t r i n g ) ] = { v a l p s = s t r s p l i t "@"
i f ( p s . l e n g t h == 2 ) Some ( p s ( 0 ) , p s ( 1 ) ) e l s e None }
}
IExtraktoren erlaubenerweitertespattern matching:
v a l s = E M a i l ( " c x l@d f k i . de " )
s match { c a s e E M a i l ( u s e r , domain ) =>. . .}
ITypgesteuertespattern matching:
v a l x : Any
x match { c a s e E M a i l ( u s e r , domain ) =>. . .}
19 [21]
Weitere Besonderheiten
I Native XML support, Beispiel:CCTherm.scala
I Implizite Konversionen und Parameter
20 [21]
Zusammenfassung
IHaskell + Java = Scala (?)
ISkalierbare Sprache:
Imächtige Basiskonstrukte
Iplus flexibles Typsystem
Iplus flexible Syntax (“syntaktischer Zucker”)
IDie Zukunft von Java?
21 [21]