TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2016-01-14
Ziemlich exakt die gleiche Prüfung wie Prüfung 2014-01-16.
Forum[Bearbeiten | Quelltext bearbeiten]
Diskussion im Forum dazu: Thread
Aufgabe 1[Bearbeiten | Quelltext bearbeiten]
Geben Sie die Werte und den allgemeinsten Typ von t1 bis t7 an. (Hier im VoWi kannst du die leeren Zeilen auswählen um die Lösungen zu sehen.)
Aufgabe 2[Bearbeiten | Quelltext bearbeiten]
Definieren Sie einen polymorphen algebraischen Datentyp BTplus zur Darstellung von binären Bäumen. Knoten enthalten neben zwei (unabhängigen) polymorphen Elementen zwei Unterbäume. Weiters gibt es auch leere Bäume und leere Unterbäume.
data BTPlus a b = Nil | Node a b (BTPlus a b) (BTPlus a b)
Aufgabe 3[Bearbeiten | Quelltext bearbeiten]
Geben Sie einen konkreten Wert für BTplus sowie seinen genauen Typ an, der die Werte "a" und 2 enthält und genau zwei Knoten aufweist in Haskell-Syntax mit seinem Typ und als Zeichnung.
tree1 = Node "a" 2 (Node "b" 3 Nil Nil) Nil :: BTPlus [Char] Integer
Aufgabe 4[Bearbeiten | Quelltext bearbeiten]
Definieren Sie requal, das für zwei BTplus-Bäume genau dann True ist, wenn beide Bäume Knoten an den gleichen Stellen besitzen und der zweite polymorphe Eintrag jedes Knotens gleich dem ersten Eintrag des anderen an der gleichen Stelle befindlichen Knotens ist. Geben Sie hier eine möglichst allgemeine Deklaration an!
requal :: (Eq a, Eq b) => BTPlus a b -> BTPlus b a -> Bool
requal Nil Nil = True
requal (Node a b t1 t2) (Node c d t3 t4) = (a == d) && (b == c) && requal t1 t3 && requal t2 t4
requal _ _ = False
Aufgabe 5[Bearbeiten | Quelltext bearbeiten]
Definieren Sie filterbt, das eine einstellige boolsche Funktion und zwei BTplus erwartet und eine Liste jener ersten Einträge des ersten Baums und jener zweiten Einträge des zweiten Baums in beliebiger Reihenfolge zurückliefert, für die die boolsche Funktion zutrifft. Geben Sie für filterbt die entsprechende möglichst allgemeine Typdeklaration an.
filterbt :: (a -> Bool) -> BTPlus a b -> BTPlus c a -> [a]
filterbt _ Nil Nil = []
filterbt f (Node a _ t1 t2) Nil = [a | f a] ++ filterbt f t1 Nil ++ filterbt f t2 Nil
filterbt f Nil (Node _ b t1 t2) = [b | f b] ++ filterbt f Nil t1 ++ filterbt f Nil t2
filterbt f t1 t2 = filterbt f t1 Nil ++ filterbt f Nil t2