67 lines
3.2 KiB
Markdown
67 lines
3.2 KiB
Markdown
|
# Fortgeschrittene funktionale Programmierung in Haskell
|
||
|
|
||
|
FFPiH ist eine Vorlesung, die ich zusammen mit einem Kommilitonen im Sommer 2015
|
||
|
erstmals erstellt und gehalten haben.
|
||
|
|
||
|
Insgesamt haben wir die Vorlesung 3x gehalten, wobei von der ersten zur zweiten
|
||
|
Iteration der Inhalt massiv überarbeitet wurde und bei der Iteration von der
|
||
|
zweiten zur dritten Vorlesung die Übungen komplett neu erstellt wurden.
|
||
|
|
||
|
Die gesamten Übungen sind unter anderem in der FFPiH-Organisation in meinem
|
||
|
gitea hinterlegt:
|
||
|
[https://gitea.dresselhaus.cloud/FFPiH](https://gitea.dresselhaus.cloud/FFPiH)
|
||
|
|
||
|
Einige der aktualisierten Übungen sind privat geschaltet, da diese iterativ
|
||
|
aufeinander aufbauen und jeweils die Musterlösung der vorherigen enthalten.
|
||
|
|
||
|
## Aufbau der Vorlesung
|
||
|
|
||
|
Vorausgesetzt wurde, dass die Studierenden das erste Semester abgeschlossen
|
||
|
hatten und somit bereits leichte Grundlagen in Haskell kannten (aber z.b. Dinge
|
||
|
wie Functor/Applicative/Monad noch nicht *wirklich* erklärt bekommen haben).
|
||
|
|
||
|
Stück für Stück werden die Studis dann zunächst in abstrakte Konstrukte
|
||
|
eingeführt, aber diese werden dann schnell in die Praxis umgesetzt. Etwa mit dem
|
||
|
Schreiben eines eigenen Parsers.
|
||
|
|
||
|
Schlussendlich gibt es dann einen "Rundumschlag" durch die gesamte Informatik.
|
||
|
Erstellung eines Spieles (auf basis einer kleinen Grundlage), erstellung von
|
||
|
WebApps mit Yesod, Parallelisierung und Nebenläufigkeit für rechenintensive
|
||
|
Anwendungen inkl. synchronisation mittels STM.
|
||
|
|
||
|
Optional gab es weitere Übungen zu dingen wie "verteiltes Rechnen".
|
||
|
|
||
|
Ziel hierbei war nicht, diese ganzen Themen in der Tiefe beizubringen, sondern
|
||
|
aufzuzeigen, wie sie sehr schnell abstrakte Konstrukte, die ihnen ggf. 3 Semester
|
||
|
später erst begegnen bugfrei benutzen können, da Haskell hier in sehr vielen
|
||
|
Fällen einfach nur die "richtige" Lösung kompilieren lässt und alle gängigen
|
||
|
Fallen schlicht ausschließt. Beispiel ist z.b. STM innerhalb von STM, Mischen
|
||
|
von DB-Monade, Handler-Monade und Template-Engine in Yesod, Process () statt IO
|
||
|
() in der Nutzung von CloudHaskell, etc. pp.
|
||
|
|
||
|
## Studentisches Feedback
|
||
|
|
||
|
Sehr gutes Feedback von den Studenten bekamen wir insbesondere für Übungen wie:
|
||
|
|
||
|
[Übung 2, Aufgabe 2](https://gitea.dresselhaus.cloud/FFPiH/uebung2017_2/src/branch/master/src/Aufgabe2.hs),
|
||
|
weil hier durch "einfaches" umformen hin zu Abstraktionen und mit den Regeln dieser
|
||
|
im ersten Fall die Laufzeit (vor Compileroptimierungen) von O(n²) auf O(0) ändert.
|
||
|
|
||
|
[Übung 4](https://gitea.dresselhaus.cloud/FFPiH/uebung2017-4), welche ein
|
||
|
komplett fertigen (sehr rudimentären und simplen) Dungeon-Crawler bereitstellt,
|
||
|
der "nur" 1-2 bugs hat und "wie ein echtes Projekt" erweitert werden muss.
|
||
|
Diese Übung hat sich dann über 4 weitere Übungen gestreckt, wobei folgende
|
||
|
Aufgaben gelöst werden müssen:
|
||
|
|
||
|
- Einarbeitung in QuickCheck zur Behebung eines Bugs im Test
|
||
|
- Umschreiben von explizitem Argument-Passing hin zu Monad-Transformers mit
|
||
|
stateful [[Lenses|lenses]]#
|
||
|
- Continuation-Basierendes Event-System
|
||
|
- Hinzufügen eines Parsers für Level, Items & deren Effekte und
|
||
|
implementation dieser
|
||
|
- Ändern des GUI-Parts von CLI auf 2D GL mittels gloss
|
||
|
- Ändern von `StateT World` auf `RWST GameConfig Log World` und somit nutzen von
|
||
|
individuellen Konfigurationen für z.b. Keybindings
|
||
|
|
||
|
|