• Keine Ergebnisse gefunden

Praktische Informatik 3: Funktionale Programmierung Vorlesung 14 vom 29.01.13: Schlußbemerkungen

N/A
N/A
Protected

Academic year: 2022

Aktie "Praktische Informatik 3: Funktionale Programmierung Vorlesung 14 vom 29.01.13: Schlußbemerkungen"

Copied!
49
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Praktische Informatik 3: Funktionale Programmierung Vorlesung 14 vom 29.01.13: Schlußbemerkungen

Christoph Lüth

Universität Bremen

Wintersemester 2012/13

Rev. 2011 1 [1]

(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 Effizienzaspekte

I Eine Einführung in Scala

I Rückblich & Ausblick

(3)

Fachgespräch: Beispielaufgabe

Definieren Sie eine Funktion leastSpaces, welche aus einer Liste von Zeichenketten diejenige zurückgibt, welche die wenigsten Leerzeichen enthält.

Beispiel:

leastSpace ["a␣bc", "pqr", "x␣y␣z"] "pqr"

3 [1]

(4)

Fachgespräch: Beispielaufgabe

Definieren Sie eine Funktion leastSpaces, welche aus einer Liste von Zeichenketten diejenige zurückgibt, welche die wenigsten Leerzeichen enthält.

Beispiel:

leastSpace ["a␣bc", "pqr", "x␣y␣z"] "pqr"

(5)

Inhalt

I Wiederholung

I Rückblick, Ausblick

4 [1]

(6)

Verständnisfragen

Auf allen Übungsblättern finden sich Verständnisfragen zur Vorlesung.

Diese sind nicht Bestandteil der Abgabe, können aber im Fachgesprach thematisiert werden. Wenn Sie das Gefühl haben, diese Fragen nicht sicher beantworten zu können, wenden Sie sich gerne an Ihren Tutor, an Berthold Hoffmann in seiner Fragestunde, oder an den Dozenten.

(7)

Verständnisfragen: Übungsblatt 1

1. Was bedeutet Striktheit, und welche in Haskell definierbaren Funktionen haben diese Eigenschaft?

2. Was ist ein algebraischer Datentyp, und was ist ein Konstruktor?

3. Was sind die drei Eigenschaften, welche die Konstruktoren eines algebraischen Datentyps auszeichnen, was ermöglichen sie und warum?

6 [1]

(8)

Verständnisfragen: Übungsblatt 1

1. Was bedeutet Striktheit, und welche in Haskell definierbaren Funktionen haben diese Eigenschaft?

2. Was ist ein algebraischer Datentyp, und was ist ein Konstruktor?

3. Was sind die drei Eigenschaften, welche die Konstruktoren eines algebraischen Datentyps auszeichnen, was ermöglichen sie und warum?

(9)

Verständnisfragen: Übungsblatt 1

1. Was bedeutet Striktheit, und welche in Haskell definierbaren Funktionen haben diese Eigenschaft?

2. Was ist ein algebraischer Datentyp, und was ist ein Konstruktor?

3. Was sind die drei Eigenschaften, welche die Konstruktoren eines algebraischen Datentyps auszeichnen, was ermöglichen sie und warum?

6 [1]

(10)

Verständnisfragen: Übungsblatt 2

1. Welche zusätzliche Mächtigkeit wird durch Rekursion bei algebraischen Datentypen in der Modellierung erreicht? Was läßt sich mit rekursiven Datentypen modellieren, was sich nicht durch nicht-rekursive

Datentypen erreichen läßt?

2. Was ist der Unterschied zwischen Bäumen und Graphen, in Haskell modelliert?

3. Was sind die wesentlichen Gemeinsamkeiten, und was sind die wesentlichen Unterschiede zwischen algebraischen Datentypen in Haskell, und Objekten in Java?

(11)

Verständnisfragen: Übungsblatt 2

1. Welche zusätzliche Mächtigkeit wird durch Rekursion bei algebraischen Datentypen in der Modellierung erreicht? Was läßt sich mit rekursiven Datentypen modellieren, was sich nicht durch nicht-rekursive

Datentypen erreichen läßt?

2. Was ist der Unterschied zwischen Bäumen und Graphen, in Haskell modelliert?

3. Was sind die wesentlichen Gemeinsamkeiten, und was sind die wesentlichen Unterschiede zwischen algebraischen Datentypen in Haskell, und Objekten in Java?

7 [1]

(12)

Verständnisfragen: Übungsblatt 2

1. Welche zusätzliche Mächtigkeit wird durch Rekursion bei algebraischen Datentypen in der Modellierung erreicht? Was läßt sich mit rekursiven Datentypen modellieren, was sich nicht durch nicht-rekursive

Datentypen erreichen läßt?

2. Was ist der Unterschied zwischen Bäumen und Graphen, in Haskell modelliert?

3. Was sind die wesentlichen Gemeinsamkeiten, und was sind die wesentlichen Unterschiede zwischen algebraischen Datentypen in Haskell, und Objekten in Java?

(13)

Verständnisfragen: Übungsblatt 3

1. Was ist Polymorphie?

2. Welche zwei Arten der Polymorphie haben wir kennengelernt, und wie unterschieden sie sich?

3. Was ist der Unterschied zwischen Polymorphie in Haskell, und Polymorphie in Java?

8 [1]

(14)

Verständnisfragen: Übungsblatt 3

1. Was ist Polymorphie?

2. Welche zwei Arten der Polymorphie haben wir kennengelernt, und wie unterschieden sie sich?

3. Was ist der Unterschied zwischen Polymorphie in Haskell, und Polymorphie in Java?

(15)

Verständnisfragen: Übungsblatt 3

1. Was ist Polymorphie?

2. Welche zwei Arten der Polymorphie haben wir kennengelernt, und wie unterschieden sie sich?

3. Was ist der Unterschied zwischen Polymorphie in Haskell, und Polymorphie in Java?

8 [1]

(16)

Verständnisfragen: Übungsblatt 4

1. Was kennzeichnet einfach rekursive Funktionen, wie wir sie in der Vorlesung kennengelernt haben, und wie sind sie durch die Funktion foldrdarstellbar?

2. Welche anderen geläufigen Funktionen höherer Ordnung kennen wir? 3. Was istη-Kontraktion, und warum ist es zulässig?

4. Wann verwendet manfoldr, wannfoldl, und unter welchen Bedingungen ist das Ergebnis das gleiche?

(17)

Verständnisfragen: Übungsblatt 4

1. Was kennzeichnet einfach rekursive Funktionen, wie wir sie in der Vorlesung kennengelernt haben, und wie sind sie durch die Funktion foldrdarstellbar?

2. Welche anderen geläufigen Funktionen höherer Ordnung kennen wir?

3. Was istη-Kontraktion, und warum ist es zulässig?

4. Wann verwendet manfoldr, wannfoldl, und unter welchen Bedingungen ist das Ergebnis das gleiche?

9 [1]

(18)

Verständnisfragen: Übungsblatt 4

1. Was kennzeichnet einfach rekursive Funktionen, wie wir sie in der Vorlesung kennengelernt haben, und wie sind sie durch die Funktion foldrdarstellbar?

2. Welche anderen geläufigen Funktionen höherer Ordnung kennen wir?

3. Was istη-Kontraktion, und warum ist es zulässig?

4. Wann verwendet manfoldr, wannfoldl, und unter welchen Bedingungen ist das Ergebnis das gleiche?

(19)

Verständnisfragen: Übungsblatt 4

1. Was kennzeichnet einfach rekursive Funktionen, wie wir sie in der Vorlesung kennengelernt haben, und wie sind sie durch die Funktion foldrdarstellbar?

2. Welche anderen geläufigen Funktionen höherer Ordnung kennen wir?

3. Was istη-Kontraktion, und warum ist es zulässig?

4. Wann verwendet manfoldr, wannfoldl, und unter welchen Bedingungen ist das Ergebnis das gleiche?

9 [1]

(20)

Verständnisfragen: Übungsblatt 5

1. foldrist die „kanonische einfach rekursive Funktion“ (Vorlesung). Was bedeutet das, und warum ist das so? Für welche Datentypen gilt das?

2. Wann kannfoldr f a xs auch für ein zyklisches Argument xs(bspw. eine zyklische Liste) terminieren?

3. Was ist die Grundidee hinter Parserkombinatoren, und funktioniert diese Idee nur für Parser oder auch für andere Problemstellungen?

(21)

Verständnisfragen: Übungsblatt 5

1. foldrist die „kanonische einfach rekursive Funktion“ (Vorlesung). Was bedeutet das, und warum ist das so? Für welche Datentypen gilt das?

2. Wann kannfoldr f a xs auch für ein zyklisches Argumentxs (bspw.

eine zyklische Liste) terminieren?

3. Was ist die Grundidee hinter Parserkombinatoren, und funktioniert diese Idee nur für Parser oder auch für andere Problemstellungen?

10 [1]

(22)

Verständnisfragen: Übungsblatt 5

1. foldrist die „kanonische einfach rekursive Funktion“ (Vorlesung). Was bedeutet das, und warum ist das so? Für welche Datentypen gilt das?

2. Wann kannfoldr f a xs auch für ein zyklisches Argumentxs (bspw.

eine zyklische Liste) terminieren?

3. Was ist die Grundidee hinter Parserkombinatoren, und funktioniert diese Idee nur für Parser oder auch für andere Problemstellungen?

(23)

Verständnisfragen: Übungsblatt 6

1. Warum ist es hilfreich, Typen abzuleiten und nicht nur die gegebene Typisierung zu überprüfen?

2. Welches sind drei charakteristische Eigenschaften von Haskells Typsystem (Hindley-Milner)?

3. Was ist Unifikation, und welche Rolle spielt sie bei der Typinferenz? Wann kann sie fehlschlagen, und was sind Beispiele

(Haskell-Programme, deren Typinferenz fehlschlägt) dafür?

11 [1]

(24)

Verständnisfragen: Übungsblatt 6

1. Warum ist es hilfreich, Typen abzuleiten und nicht nur die gegebene Typisierung zu überprüfen?

2. Welches sind drei charakteristische Eigenschaften von Haskells Typsystem (Hindley-Milner)?

3. Was ist Unifikation, und welche Rolle spielt sie bei der Typinferenz? Wann kann sie fehlschlagen, und was sind Beispiele

(Haskell-Programme, deren Typinferenz fehlschlägt) dafür?

(25)

Verständnisfragen: Übungsblatt 6

1. Warum ist es hilfreich, Typen abzuleiten und nicht nur die gegebene Typisierung zu überprüfen?

2. Welches sind drei charakteristische Eigenschaften von Haskells Typsystem (Hindley-Milner)?

3. Was ist Unifikation, und welche Rolle spielt sie bei der Typinferenz?

Wann kann sie fehlschlagen, und was sind Beispiele

(Haskell-Programme, deren Typinferenz fehlschlägt) dafür?

11 [1]

(26)

Verständnisfragen: Übungsblatt 7

1. Was ist ein abstrakter Datentyp (ADT)?

2. Was sind Unterschiede und Gemeinsamkeiten zwischen ADTs und Objekten, wie wir sie aus Sprachen wie Java kennen?

3. Wozu dienen Module in Haskell?

(27)

Verständnisfragen: Übungsblatt 7

1. Was ist ein abstrakter Datentyp (ADT)?

2. Was sind Unterschiede und Gemeinsamkeiten zwischen ADTs und Objekten, wie wir sie aus Sprachen wie Java kennen?

3. Wozu dienen Module in Haskell?

12 [1]

(28)

Verständnisfragen: Übungsblatt 7

1. Was ist ein abstrakter Datentyp (ADT)?

2. Was sind Unterschiede und Gemeinsamkeiten zwischen ADTs und Objekten, wie wir sie aus Sprachen wie Java kennen?

3. Wozu dienen Module in Haskell?

(29)

Verständnisfragen: Übungsblatt 8

1. Wie können wir die Typen und Operationen der Signatur eines abstrakten Datentypen grob klassifizieren, und welche Auswirkungen hat diese Klassifikation auf die zu formulierenden Eigenschaften?

2. Warum „finden Tests Fehler“, aber „zeigen Beweise Korrektheit“, wie in der Vorlesung behauptet? Stimmt das immer?

3. Müssen Axiome immer ausführbar sein? Welche Axiome wären nicht ausführbar?

13 [1]

(30)

Verständnisfragen: Übungsblatt 8

1. Wie können wir die Typen und Operationen der Signatur eines abstrakten Datentypen grob klassifizieren, und welche Auswirkungen hat diese Klassifikation auf die zu formulierenden Eigenschaften?

2. Warum „finden Tests Fehler“, aber „zeigen Beweise Korrektheit“, wie in der Vorlesung behauptet? Stimmt das immer?

3. Müssen Axiome immer ausführbar sein? Welche Axiome wären nicht ausführbar?

(31)

Verständnisfragen: Übungsblatt 8

1. Wie können wir die Typen und Operationen der Signatur eines abstrakten Datentypen grob klassifizieren, und welche Auswirkungen hat diese Klassifikation auf die zu formulierenden Eigenschaften?

2. Warum „finden Tests Fehler“, aber „zeigen Beweise Korrektheit“, wie in der Vorlesung behauptet? Stimmt das immer?

3. Müssen Axiome immer ausführbar sein? Welche Axiome wären nicht ausführbar?

13 [1]

(32)

Verständnisfragen: Übungsblatt 9

1. Der DatentypStreamα ist definiert als

data S t r e am α = Cons α ( S t r e a m α)

Gibt es für diesen Datentyp ein Induktionsprinzip? Ist es sinnvoll?

2. Welche nichtausführbaren Prädikate haben wir in der Vorlesung kennengelernt?

3. Wie kann man in einem Induktionsbeweis die Induktionsvoraussetzung stärken?

4. Gibt es einen Weihnachtsmann?

(33)

Verständnisfragen: Übungsblatt 9

1. Der DatentypStreamα ist definiert als

data S t r e am α = Cons α ( S t r e a m α)

Gibt es für diesen Datentyp ein Induktionsprinzip? Ist es sinnvoll?

2. Welche nichtausführbaren Prädikate haben wir in der Vorlesung kennengelernt?

3. Wie kann man in einem Induktionsbeweis die Induktionsvoraussetzung stärken?

4. Gibt es einen Weihnachtsmann?

14 [1]

(34)

Verständnisfragen: Übungsblatt 9

1. Der DatentypStreamα ist definiert als

data S t r e am α = Cons α ( S t r e a m α)

Gibt es für diesen Datentyp ein Induktionsprinzip? Ist es sinnvoll?

2. Welche nichtausführbaren Prädikate haben wir in der Vorlesung kennengelernt?

3. Wie kann man in einem Induktionsbeweis die Induktionsvoraussetzung stärken?

4. Gibt es einen Weihnachtsmann?

(35)

Verständnisfragen: Übungsblatt 9

1. Der DatentypStreamα ist definiert als

data S t r e am α = Cons α ( S t r e a m α)

Gibt es für diesen Datentyp ein Induktionsprinzip? Ist es sinnvoll?

2. Welche nichtausführbaren Prädikate haben wir in der Vorlesung kennengelernt?

3. Wie kann man in einem Induktionsbeweis die Induktionsvoraussetzung stärken?

4. Gibt es einen Weihnachtsmann?

14 [1]

(36)

Verständnisfragen: Übungsblatt 10

1. Warum ist die Erzeugung von Zufallszahlen eine Aktion?

2. Warum sind Aktionen nicht explizit als Zustandsübergang modelliert, sonder als abstrakter DatentypIO?

3. Außer dem Mangel an referentieller Transparenz, was ist die entscheidende Eigenschaft, die Aktionen von reinen Funktionen unterscheidet?

(37)

Verständnisfragen: Übungsblatt 10

1. Warum ist die Erzeugung von Zufallszahlen eine Aktion?

2. Warum sind Aktionen nicht explizit als Zustandsübergang modelliert, sonder als abstrakter DatentypIO?

3. Außer dem Mangel an referentieller Transparenz, was ist die entscheidende Eigenschaft, die Aktionen von reinen Funktionen unterscheidet?

15 [1]

(38)

Verständnisfragen: Übungsblatt 10

1. Warum ist die Erzeugung von Zufallszahlen eine Aktion?

2. Warum sind Aktionen nicht explizit als Zustandsübergang modelliert, sonder als abstrakter DatentypIO?

3. Außer dem Mangel an referentieller Transparenz, was ist die entscheidende Eigenschaft, die Aktionen von reinen Funktionen unterscheidet?

(39)

Verständnisfragen: Übungsblatt 11

1. Warum sind endrekursive Funktionen im allgemeinen schneller als nicht-endrekursive Funktionen? Unter welchen Voraussetzungen kann ich eine Funktion in endrekursive Form überführen?

2. Ist eine in allen Argumenten als strikt erkannte und übersetzte

Funktion immer schneller in der Ausführung als dieselbe als nicht-strikt übersetzte Funktion?

3. Warum kann ich die Funktionseqnicht in Haskell definieren?

16 [1]

(40)

Verständnisfragen: Übungsblatt 11

1. Warum sind endrekursive Funktionen im allgemeinen schneller als nicht-endrekursive Funktionen? Unter welchen Voraussetzungen kann ich eine Funktion in endrekursive Form überführen?

2. Ist eine in allen Argumenten als strikt erkannte und übersetzte

Funktion immer schneller in der Ausführung als dieselbe als nicht-strikt übersetzte Funktion?

3. Warum kann ich die Funktionseqnicht in Haskell definieren?

(41)

Verständnisfragen: Übungsblatt 11

1. Warum sind endrekursive Funktionen im allgemeinen schneller als nicht-endrekursive Funktionen? Unter welchen Voraussetzungen kann ich eine Funktion in endrekursive Form überführen?

2. Ist eine in allen Argumenten als strikt erkannte und übersetzte

Funktion immer schneller in der Ausführung als dieselbe als nicht-strikt übersetzte Funktion?

3. Warum kann ich die Funktionseqnicht in Haskell definieren?

16 [1]

(42)

Zusammenfassung Haskell

Stärken:

I Abstraktiondurch

I Polymorphieund Typsystem

I algebraischeDatentypen

I Funktionenhöherer Ordnung

I Flexible Syntax

I Haskell alsMeta-Sprache

I Ausgereifter Compiler

I Viele Büchereien

Schwächen:

I Komplexität

I Büchereien

I Vielim Fluß

I Keinstabilerundbrauchbarer Standard

I DivergierendeZiele:

I Forschungsplattformund nutzbares Werkzeug

I Entwicklungsumgebungen

(43)

Andere Funktionale Sprachen

I Standard ML(SML):

I Streng typisiert, strikte Auswertung

I Formal definierte Semantik

I Drei aktiv unterstütze Compiler

I Verwendet in Theorembeweisern (Isabelle, HOL)

I http://www.standardml.org/

I Caml,O’Caml:

I Streng typisiert, strikte Auswertung

I Hocheffizienter Compiler, byte code & nativ

I Nur ein Compiler (O’Caml)

I http://caml.inria.fr/

18 [1]

(44)

Andere Funktionale Sprachen

I LISPund Scheme

I Ungetypt/schwach getypt

I Seiteneffekte

I Viele effiziente Compiler, aber viele Dialekte

I Auch industriell verwendet

I Hybridsprachen:

I Scala (Functional-OO, JVM)

I F# (Functional-OO, .Net)

I Clojure (Lisp, JVM)

(45)

Warum funktionale Programmierung nie Erfolg haben wird

I Programmierungnur kleiner Teil der SW-Entwicklung

I MangelndeUnterstützung:

I Libraries, Dokumentation, Entwicklungsumgebungen

I Nichtverbreitet — funktionale Programmierer zu teuer

I Konservatives Management

I “Nobody ever got fired for buying IBM”

20 [1]

(46)

Funktionale Programmierung in der Industrie

I Erlang

I schwach typisiert, nebenläufig, strikt

I Fa. Ericsson — Telekom-Anwendungen

I FL

I ML-artige Sprache

I Chip-Verifikation der Fa. Intel

I Python(und andere Skriptsprachen):

I Listen, Funktionen höherer Ordnung (map, fold), anonyme Funktionen, Listenkomprehension

I Big Data:

(47)

Warum funktionale Programmierung lernen?

I Denken inAlgorithmen, nicht inProgrammiersprachen

I Abstraktion:Konzentration auf das Wesentliche

I WesentlicheElemente moderner Programmierung:

I DatenabstraktionundFunktionale Abstraktion

I Modularisierung

I TypisierungundSpezifikation

I Blick über den Tellerrand — Blick in die Zukunft

I Studium6=Programmierkurs — was kommt in 10 Jahren?

22 [1]

(48)

Hilfe!

I Haskell: primäre Entwicklungssprache am DFKI, FG CPS

I Sicherheit in der Robotik:http://www.dfki.de/cps/sams

I Formale Programmentwicklung: http://www.tzi.de/cofi/hets

I Wir suchenstudentische Hilfskräftefür diese Projekte

I Wir bieten:

I AngenehmesArbeitsumfeld

I InteressanteTätigkeit

I Wir suchenTutoren für PI3

(49)

Tschüß!

24 [1]

Referenzen

ÄHNLICHE DOKUMENTE

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

Ein abstrakter Datentyp (ADT) besteht aus einem (oder mehreren) Typen und Operationen darauf, mit folgenden Eigenschaften:. I Werte des Typen können nur über die

3. Was sind die wesentlichen Gemeinsamkeiten, und was sind die wesentlichen Unterschiede zwischen algebraischen Datentypen in Haskell, und Objekten in Java?.. Welche

Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom 21.10.2014: Funktionen und Datentypen..

contains :: Id→ Path→ Bool cat :: Path→ Path→ Path snoc :: Path→ Id → Path..

I Werte des Typen können nur über die bereitgestellten Operationen erzeugt werden. I Eigenschaften von Werten des Typen werden nur über die bereitgestellten

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

Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom 30.10.2012: Rekursive Datentypen..