Lehrstuhl für Softwaretechnik und Programmiersprachen Jens Bendisposto Funktionale Programmierung – WS 14/15 Übungsblatt 8 Aufgabe 8.1 (Sequenz Monade) Gegeben seien folgende Definitionen für bind und return (def return list) (defn bind [mv f] (mapcat f mv)) a) Beweisen Sie, das die beiden Funktionen die Monadeneigenschaften erfüllen. b) Ein betrunkener Seemann torkelt einen Steg entlang. Mit der gleichen Wahrscheinlichkeit macht der Seemann einen Schritt nach vorne, rechts oder links. Der Steg ist insgesamt drei Schritte breit, d.h. der Seemann kann ausgehend von der Mitte maximal einen Schritt nach rechts oder links machen. Schreiben Sie einen Seemann simulator mit Hilfe der SequenzMonade. Die Simulationsfunktion bekommt als Parameter die maximale Anzahl an Schritten. Die Ausgabe ist eine Liste von Maps. Mit zwei Schritten soll das Resultat in etwa so aussehen (die Reihenfolge der Ergebnisse ist egal): ({:trocken {:trocken {:trocken {:trocken {:trocken {:trocken {:trocken {:trocken {:trocken true true true true false true true true false :pfad [:vor :vor]} :pfad [:vor :links]} :pfad [:vor :rechts]} :pfad [:links :vor]} :pfad [:links :links]} :pfad [:links :rechts]} :pfad [:rechts :vor]} :pfad [:rechts :links]} :pfad [:rechts :rechts]}) Aufgabe 8.2 (Monaden) Beim Fizzbuzz Problem sollen in einer Sequenz von Zahlen alle durch 3 teilbaren Zahlen durch :fizz, alle durch 5 teilbaren Zahlen durch :buzz und alle durch 3 und 5 teilbaren Zahlen durch :fizzbuzz ersetzt werden. Im Folgenden werden wir eine Variante des Problems betrachten. Statt :fizzbuzz soll nichtdeterministisch entweder :fizz oder :buzz eingesetzt werden. a) Schreiben Sie eine Funktion fizzbuzz-mfn für die Sequenz-Monade, die für eine gegebene Zahl die nichtdeterministische Berechnung durchführt. b) Schreiben Sie eine Funktion fizzbuzz-m, die eine Sequenz von Zahlen bekommt und die nichtdeterministische Funktion für die Sequenz durchführt. Ergebnis sollen alle möglichen Sequenzen sein, die beim Ausführen der Berechnung auftreten können. Hinweis: Die monadische map Funktion m-map könnte helfen. Beispielaufruf: => (fizzbuzz-m [1 2 ((1 2 :fizz 4 :buzz (1 2 :fizz 4 :buzz (1 2 :fizz 4 :buzz (1 2 :fizz 4 :buzz 3 7 7 7 7 4 5 7 :fizz :fizz :buzz :buzz 15 16 16 16 16 16 15]) :fizz) :buzz) :fizz) :buzz)) Aufgabe 8.3 (Monaden) a) Gegeben sei eine Funktion f mit dem Typ a->b. Welchen Typ hat die Funktion, wenn man m-lift in der Sequenzmonade auf die Funktion anwendet? b) Ist die geliftete Funktion eine monadische Funktion? Was ist eine monadische Funktion?