• Keine Ergebnisse gefunden

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

N/A
N/A
Protected

Academic year: 2022

Aktie "Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom 20.01.15: Scala — Eine praktische Einführung"

Copied!
22
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

Christoph Lüth

Universität Bremen

Wintersemester 2014/15

(2)

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 Effizienzaspekte

I Scala — Eine praktische Einführung

I Rückblich & Ausblick

(3)

Heute: Scala

I Ascalable 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 Typesafe Inc.

(4)

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?

I Interaktive Auswertung

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)

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?

I Interaktive Auswertung

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

(6)

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?

I Interaktive Auswertung

I Variablen, veränderlich —Mit Vorsicht benutzen!

I Werte, unveränderlich

I while-Schleifen

I Rekursion — einfache Endrekursion wird optimiert

I Typinferenz — mehr als Java, weniger als Haskell

(7)

Scala am Beispiel: 01-GCD.scala

Was sehen wir hier?

I Interaktive Auswertung

I Variablen, veränderlich —Mit Vorsicht benutzen!

I Werte, unveränderlich

I while-Schleifen — Unnötig!

I Rekursion — einfache Endrekursion wird optimiert

I Typinferenz — mehr als Java, weniger als Haskell

(8)

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

(9)

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

(10)

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 case 4 =>— Literale

I case C(4) =>— Konstruktoren

I case C(x) =>— Variablen

I case C(_) =>— Wildcards

I case x: C =>— getypte pattern

I case C(D(x: T, y), 4) =>— geschachtelt

(11)

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 case 4 =>— Literale

I case C(4) =>— Konstruktoren

I case C(x) =>— Variablen

I case C(_) =>— Wildcards

I case x: C =>— getypte pattern

I case C(D(x: T, y), 4) =>— geschachtelt

(12)

Implementierung algebraischer Datentypen

Haskell:

data T = C1 |. . . | Cn

I Ein TypT

I Konstruktoren erzeugen Datentyp

Scala:

T

C1 . . . Cn

-

I Varianten alsSubtypen

I Problem und Vorteil:

Erweiterbarkeit

I sealedverhindert Erweiterung

(13)

Implementierung algebraischer Datentypen

Haskell:

data T = C1 |. . . | Cn

I Ein TypT

I Konstruktoren erzeugen Datentyp

Scala:

T

C1 . . . Cn

-

I Varianten alsSubtypen

I Problem und Vorteil:

Erweiterbarkeit

I sealedverhindert Erweiterung

(14)

Das Typsystem

Das Typsystem behebt mehrere Probleme von Java:

I Werte vs. Objekte

I Scala vs. Java

I NULLreferences

(15)

Vererbungshierarchie

Quelle: Odersky, Spoon, Venners:Programming in Scala

(16)

Parametrische Polymorphie

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

I Problem: Vererbung und Polymorphie

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

I Doesnot work— 04-Ref.hs

I Warum?

I Funktionsraum nicht monoton im ersten Argument

I SeiX Y, dannZ −→X Z −→Y, aberX −→Z 6⊆Y −→Z

I SondernY −→Z X −→Z

(17)

Parametrische Polymorphie

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

I Problem: Vererbung und Polymorphie

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

I Doesnot work— 04-Ref.hs

I Warum?

I Funktionsraum nicht monoton im ersten Argument

I SeiX Y, dann Z −→X Z −→Y, aberX −→Z 6⊆Y −→Z

I SondernY −→Z X −→Z

(18)

Typvarianz

class C[+T]

I Kovariant

I S<T, dann C[S]<C[T]

I Parameter Tnur im Wertebereich von Methoden

class C[T]

I Rigide

I Kein Subtyping

I Parameter Tkann beliebigverwendet werden

class C[-T]

I Kontravariant

I S<T, dann C[T]<C[S]

I ParameterTnur im Definitionsbereich von Methoden Beispiel:

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

(19)

Traits: 05-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:05-Ordered.scala,05-Rational.scala

(20)

Was wir ausgelassen haben. . .

I Komprehension (nicht nur für Listen)

I Gleichheit (==,equals)

I Implizite Parameter und Typkonversionen

I Nebenläufigkeit (Aktoren)

(21)

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

(22)

Beurteilung

I Vorteile:

I Funktional programmieren, in der Java-Welt leben

I Gelungene Integration funktionaler und OO-Konzepte

I Sauberer Sprachentwurf, effiziente Implementierung, reiche Büchereien

I Nachteile:

I Manchmal etwaszuviel

I Entwickelt sich ständig weiter

I One-Compiler-Language, vergleichsweise langsam

I Mehr Scala?

I Besuchen Sie auch unsere VeranstaltungReaktive Programmierung

Referenzen

ÄHNLICHE DOKUMENTE

konstanter Aufwand ←→ beliebige Genauigkeit, wachsender Aufwand Haskell bietet die Auswahl:. I Int - ganze Zahlen als Maschinenworte (≥

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I.

I Für funktionale Programme: rekursiv definierte Funktionen. Äquivalenz von operationaler und

I Tutorien: Mo 10-12 MZH 5210 Christian Maeder Mo 16-18 MZH 1380 Rene Wagner Di 8-10 MZH 1100 Diedrich Wolter Di 10-12 MZH 1380 Diedrich Wolter Di 10-12 MZH 1400 Bernd Gersdorf Di

werden gleichzeitig definiert (Rekursion!) I Namen f, y und Parameter (x) überlagern andere I Es gilt die Abseitsregel. I Deshalb: Auf gleiche Einrückung der lokalen

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

I Eigenschaften von Werten des Typen (insb. ihre innere Struktur) können nur über die bereitgestellten Operationen beobachtet werden. Zur Implementation von ADTs in

I Signatur: Typ und Operationen eines ADT I Axiome: über Typen formulierte Eigenschaften. I Spezifikation = Signatur