• Keine Ergebnisse gefunden

Vorlesung vom 02.02.2011: The Next Big Thing — Scala

N/A
N/A
Protected

Academic year: 2022

Aktie "Vorlesung vom 02.02.2011: The Next Big Thing — Scala"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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]

(2)

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,XmitAB

IDann istXAXB

IAbernichtAXBX

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]

(3)

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]

Referenzen

ÄHNLICHE DOKUMENTE

2) In höheren Fachsemestern werden die freien Studienplätze durch den Vergleich der endgültig einge- schriebenen Studierenden in einzelnen Fachsemestern, Studienjahren

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom 08.01.2013: Aktionen und Zustände.. Christoph Lüth Universität Bremen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom 22.01.13: Scala — When Java meets Functional.. Christoph Lüth Universität Bremen

Christoph Lüth &amp; Dennis Walter Universität Bremen Wintersemester

Christoph Lüth &amp; Dennis Walter Universität Bremen Wintersemester

Christoph Lüth &amp; Dennis Walter Universität Bremen Wintersemester

I Statt fertiger Sprache mit vielen Konstrukten Rahmenwerk zur Implementation eigener Konstrukte:. I

Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 26.01.10:.. The Next Big Thing — Scala