• Keine Ergebnisse gefunden

9.1 Monaden(transfomer)instanzen für vordefinierte Typen

N/A
N/A
Protected

Academic year: 2022

Aktie "9.1 Monaden(transfomer)instanzen für vordefinierte Typen"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Till Mossakowski Stephan Günther Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen

WS 2019/20

9. Übungsblatt

Ausgabe: 2020-01-12 23:55 Abgabe: 2020-01-15

9.1 Monaden(transfomer)instanzen für vordefinierte Typen

In der Vorlesung wurden eine Monadeninstanz fürMaybeund eine für[], sowie eine Monadentransformerinstanz fürMaybevorgeführt. Ausserdem wurde erwähnt, dass eine Monadentransformerinstanz für[]existiert.

1. Implementieren Sie analog zu der Instanz fürMaybeeine Monadeninstanz für Either a. Warum muss die Monadeninstanz für Either adefiniert werden und nicht fürEither?

Hinweis: Da Haskell bereits eine Monadeninstanz fürEither emitliefert können Sie Ihre Implementierung leider nicht testen.

2. Implementieren Sie Analog zu der Instanz für Maybeeine Monadentransformerinstanz fürEither String, d.h. vervollständigen Sie den folgenden Codeblock:

import Control.Monad.Trans.Class

newtype EitherTransformer m a =

EitherTransformer { runEitherTransformer :: m (Either String a) }

instance (Monad m) => Monad (EitherTransformer m) where -- Immplement typeclass functions.

instance MonadTrans EitherTransformer where -- Implement typeclass functions.

3. Implementieren Sie eine Monadentransformerinstanz für die Listenmonade, d.h. vervollständigen Sie den folgenden Codeblock:

newtype ListTransformer m a =

ListTransformer { runListTransformer :: m [a] }

instance (Monad m) => Monad (ListTransformer m) where -- Immplement typeclass functions.

instance MonadTrans ListTransformer where -- Immplement typeclass functions.

9.2 Monadeninstanzen: Grenzen des bisher Gelernten

Überlegen Sie sich wie eine Monadeninstanz für den in Aufgabe 7.2 eingeführtenLeftistHeap aussehen würde.

Entwerfen Sie auch den passenden Code dafür, wobei Sie nur die in 7.2 vorgestellte Schnittstelle sowie eine Funktion

isEmpty :: Ord a => LeftistHeap a -> Bool welche testet ob ein Baum leer ist, benutzen.

Tun Sie das gleiche für den vordefinierten DatentypenSet.

Warum lässt sich Ihre Lösung wahrscheinlich nicht mit dem bisher in der Vorlesung behandelten Stoff verwirkli- chen?

— Seite 1 von 2 —

(2)

9. Übungsblatt Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen WS 2019/20 ,

9.3 An Arbitrary and Odd Exercise

In der Übung und den Vorlesungen wurde bereits das Testen mithspecundQuickCheckdurchgesprochen. Das QuickCheckPaket definiert die TypklasseArbitrary. Definieren Sie einen TypenOddder lediglich einen Wert vom TypInteger enthält, sowie eine Arbitrary Instanz für diesen Typen, die nurOdd Werte generiert, in denen sich ein ungerader Wert befindet. Vervollständigen Sie also den folgenden Code so, dassmain niemals Fehlschlägt:

import Test.Hspec import Test.QuickCheck

newtype Odd = Odd Integer deriving Show

instance Arbitrary Odd where

arbitrary = -- Your arbitrary implementation.

main = hspec $ do

describe "9.3: Arbitrarily odd: The Arbitrary instance for odd" $ do it "should only generate odd Odds." $ property $

withMaxSuccess 97 ( \(Odd x) -> odd x )

IhreArbitraryInstanz sollte allerdings tatsächlich zufällige, im allgemeinen voneinander unterschiedliche Werte generieren.

Hinweise:

• Wahrscheinlich müssen Sie zum Ausprobieren Ihres Codes die PaketeQuickCheckundhspecinstallieren.

• Falls Sie Probleme haben einen Lösungsansatz zu finden, versuchen Sie die Funktion choosAny, sowie die Tatsache, dass der für die Lösung benötigte TypGeneine Monade ist, zu nutzen.

9.4 * Either Monad Transformer Generalised

In Aufgabe 9.1.2 wurden Sie aufgefordert eine Monadentransformerinstanz für den TypEither String zu implementieren. Wie sieht eine Lösung aus, die diese Aufgabe stattdessen für den polymorphen TypenEither e verwirklicht?

— Seite 2 von 2 —

Referenzen

ÄHNLICHE DOKUMENTE

Auch gehören unsere Typen ganz der Periode der feinsten und reichsten Blüthe des attischen Grabreliefs an (eingeschlossen das Original der Gruppe des Künstlers

> Introns sind bewegliche Elemente und haben sich während der Eukaryotenevolution in zuvor intronlose Gene integriert.. • Exons kodieren manchmal

Vertragspartner (Auftragnehmer) eine genauere Systemdefinition für den Kunden aufstellen (Pflichtenheft), so dass der Kunde verstehen und beurteilen kann, was die Software tun

Könnten wir die Typen für alle Variablen-Vorkommen raten, ließe sich mithilfe der Regeln überprüfen, dass unsere Wahl korrekt war :-).. Wie raten wir die Typen der Variablen ???.. , x

Sind wir an topdown deterministischen Typen interessiert, reicht es, die Menge der Pfade in Termen zu

Ergänzen Sie die Textlücken im folgenden Satz durch Ankreuzen der jeweils richtigen Satzteile so, dass eine korrekte Aussage entsteht. Die angegebenen Werte könnten

● neben Steuerkreuz 6 Buttons (4 Buttons mehr als für unser

Aufteilung der positiven und negativen Halbwellen auf zwei Transistoren beide Transistoren, wenn komplement¨ ar, in Kollektorschaltung Arbeitspunkte werden durch