WS 14/15 ¨Ubungsblatt 8 - Softwaretechnik und Programmiersprachen

Werbung
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?
Herunterladen