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 —
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 —