TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2017-01-19
Aufgabe 1 (50%)[Bearbeiten | Quelltext bearbeiten]
Geben Sie Wert und allgemeinsten Typ für t1 bis t7 an! (Hier im VoWi kannst du die leeren Zeilen auswählen um die Lösungen zu sehen.)
Aufgabe 2 (5%)[Bearbeiten | Quelltext bearbeiten]
Definieren Sie einen polymorphen algebraischen Datentyp BTree zur Darstellung von binären Bäumen. Knoten enthalten neben einem polymorphen Element zwei Unterbäume. Weiters gibt es auch leere Bäume und leere Unterbäume.
data BTree a = Node a (BTree a) (BTree a) | Nil
Aufgabe 3 (5%)[Bearbeiten | Quelltext bearbeiten]
Geben Sie einen konkreten Wert des Typs BTree (BTree Integer, String), der die Werte 1, 2 und "ab" enthält, in Haskell- Syntax und als Zeichnung an.
Node (Node 1 (Node 2 Nil Nil) Nil, "ab") Nil Nil :: BTree (BTree Integer, String)
Aufgabe 4 (5+15%)[Bearbeiten | Quelltext bearbeiten]
Definieren Sie juniq, das für einen Baum des Typs BTree genau dann True ist, wenn in jedem Knoten das polymorphe Element höchstens einmal in den Unterbäumen des Knotens vorkommt. Geben Sie für juniq auch die entsprechende Typdeklaration an. (Typklasse!)
Lösungsvorschlag: Dragobitch (Diskussion) 14:12, 23. Feb. 2017 (CET)
juniq :: Eq a => BTree a -> Bool
juniq Nil = True
juniq (Node a l r)
| (count a l + count a r) > 1 = False
| otherwise = juniq l && juniq r
count :: Eq a => a -> BTree a -> Integer
count _ Nil = 0
count a (Node b l r)
| a == b = 1 + count a l + count a r
| otherwise = count a l + count a r
Lösungsalternative:
data BTree a = Nil | Node a (BTree a) (BTree a) deriving (Show)
class Juniq a where
juniq :: a -> Bool
instance Eq a => Juniq (BTree a) where
juniq Nil = True
juniq (Node x a1 a2) = juniq' a1 x 0 && juniq' a2 x 0
juniq' :: (Eq a, Eq b, Num b) => BTree a -> a -> b -> Bool
juniq' _ _ 2 = False
juniq' Nil _ _ = True
juniq' (Node x a1 a2) y c
| x == y = (juniq' a1 y (c+1)) && (juniq' a2 y (c+1))
| otherwise = (juniq' a1 y c) && (juniq' a2 y c) && (juniq' a1 x 0) && (juniq' a2 x 0)
Aufgabe 5 (5+15%)[Bearbeiten | Quelltext bearbeiten]
Definieren Sie trx, das zwei Argumente erwartet: Eine einstellige boolsche Funktion und einen BTree. Die Funktion liefere eine Liste aus Tripeln jener Knoten zurück, für die die Funktion zutrifft (angewandt auf den gesamten Knoten). Im Tripel ist das erste Element das Knotenelement, das zweite der linke und das dritte der rechte Unterbaum. Die Elemente der Liste kommen in beliebiger Reihenfolge vor. Geben Sie auch hier eine möglichst allgemeine Deklaration an!
Lösungsvorschlag: Dragobitch (Diskussion) 14:12, 23. Feb. 2017 (CET)
trx :: (BTree a -> Bool) -> BTree a -> [(a, BTree a, BTree a)]
trx _ Nil = []
trx f n@(Node a l r) = [(a,l,r)|f n] ++ (trx f l) ++ (trx f r)