Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Funktionale Programmierung in Haskell   (Übersicht)

Funktionale Programmierung in Haskell

Studiengang: Master Inf
Dauer: 30 Minuten
Prüfer: Hans-Jürgen Schneider
Datum: 31.07.2013

Allgemeines

Es gab Stift und (schon fast antikes, aber funktionstionstüchtiges ;)) Papier. Prof. Schneider nahm oft Bezug auf konkrete Beispiele aus der Vorlesung und erwartete auch als Antwort entsprechende Beispiele aus der Vorlesung (sogar so weit, dass er teilweise explizit danach gefragt hat). Nachdem ich die Vorlesung (v.a. wegen des Termins) nicht besonders oft besucht habe und mich mit den Folien und der Videoaufzeichnung vorbereitet habe, wusste ich nicht immer, worauf er hinaus wollte. Alternative Antworten waren diesbezüglich aber auch OK.

Prof. Schneider gibt das Heft während der Prüfung nicht aus der Hand. Es ist nicht möglich, das Thema zu lenken.

Inhalt

Los gings mit der Frage, was ich an Haskell gut finde in Einheit mit der Frage, was Haskell von anderen Programmiersprachen unterscheidet. Eigentlich hatte ich mir für diese Frage bereits eine Antwort überlegt, die uns etwas in Haskell hineingeführt hätte – Prof. Schneider erwartete als Antwort aber im Prinzip die Liste der Eigenschaften von Haskell. Dabei waren nicht nur Unterschiede zu imperativen Programmiersprachen, sondern auch Unterschiede zu anderen funktionalen Programmiersprachen gefragt (strenges Typsystem, Lazy Evaluation, …).

Dann ging das Gespräch hin zu Funktionen und den Möglichkeiten, die Haskell anbietet, ebensolche zu definieren. Ich habe Umbenennen, Currying (also Unterversorgung mit Parametern) und normale Funktionsdefinition genannt, dann erklärt. Bei Currying hatten wir auch das Currying von Infix-Funktionen ((op e), (e op) und (op)). Obwohl er in der Vorlesung erzählt hatte, dass man das niemals nicht benutzen sollte, hatte er dann noch danach gefragt, ob man auch Funktionen mit mehr als zwei Parametern infix benutzen kann. Anschließend wurde mir noch ein Codebeispiel vorgelegt, bei dem ich die verschiedenen Methoden der Funktionsdefinition identifizieren sollte.

Weiter gings zu Typklassen; an dem aus der Vorlesung bekannten Baumbeispiel war zu erklären, was Klassen sind, wie sie sich von Klassen in Java unterscheiden, was die Typparameter in einer class-Definition repräsentieren welche Typparameter bei der Klassendefinition an welchen Stellen eingeschränkt werden dürfen. Ich wurde gefragt, wo man Default-Implementierungen angeben darf (und ob man z.B. in der Typhierarchie Tree → BinTree → BalancedBinTree) in BinTree eine Default-Implementierung für eine Operation aus Tree angeben darf. Selbst musste ich keine Operationen implementieren. Ich musste erklären, warum man in Default-Implementierungen kein Pattern Matching benutzen kann (und wurde dann gefragt, ob man denn Pattern Matching beim Instanziieren der Klasse mit einem konkreten Datentyp nutzen darf).

Damit hatten wir den Sprung zu algebraischen Datentypen geschafft. Als geforderte Beispiele habe ich einen Datentyp für natürliche Zahlen und einen für Listen implementiert und erwähnt, dass [a] nur ein Synonym für einen algebraischen Datentyp ist. Nach einer weiteren Erwähnung von Pattern Matching gings noch kurz zu deriving. Außerdem sollte ich beantworten, wie man in einem Baum sowohl Strings als auch Integer speichern kann. Als Antwort habe ich Either a b aus dem Standardvorspann genannt, was er entweder nicht kannte oder nicht hören wollte. Meine selbstimplementierte Variante der selben ließ er dann aber gelten.

Nachdem ich erwähnt hatte, dass Listen eigentlich auch nur abstrakte Datentypen sind kamen noch Fragen zu Listen und Operationen auf Listen. Dazu hat Prof. Schneider mir einen Ausschnitt aus dem CYK-Algorithmus in Haskell vorgelegt, „der mir ja auch der Vorlesung bekannt war“ *husthust*. Zu zeigen und zu erklären waren an dem Beispiel alle Operationen auf Listen, in diesem Fall concat, zwei verschachtelte list comprehensions (Zermelo-Fränkel-Ausdrücke) und deren Bestandteile und Funktionsweise und den Index-Operator !!.

Vorbereitung

Ich habe die verfügbaren Videoaufzeichnungen bis Vorlesung 6 nochmal angekuckt und die Folien durchgearbeitet. Dabei habe ich die Vorlesungsfolien zusammengefasst. Diese Zusammenfassung gibts unter http://wwwcip.cs.fau.de/~sicslang/ss13/haskell/.

Allen Nachfolgern noch viel Erfolg!