Funktionale Programmierung – Übungsblatt IV Jörg Kreiker 14. November 2011 Aufgabe IV.1: Musterabgleich Welche Bindungen werden jeweils erzeugt? Zu was werten die Ausdrücke aus? 1. f (x:xs) (y:ys) = x+y : f xs ys f [1] [2] 2. 1:2:[3] = [1,2] in [1,2,3] 3. 1:3:[2] = [1,2] in [1,2,3] 4. [A x | A x <- [A 1, B 1, A 2, B 2]] 5. [x | (x:xs) <- [ [], [2], [], [4,5] ] ] f s@(x:xs) = x:s 6. case e of l@(x:xs) -> if x==0 then xs else l 7. (\~[x] -> 0) [] 8. (\~[x] -> x) [] 9. (\~[x, ~(a,b)] -> x) [(0,1), ⊥] 10. (\~[x, (a,b)] -> x) [(0,1), ⊥] 11. data F = F Bool • (\(F True) -> True) ⊥ • (\~(F True) -> True) ⊥ • ( (F 1) -> True) undefined • case F ⊥ of F -> 1 12. let [xs, [x]] = xs :[[x]] in 1 13. let ([x] : xs) : ys = [x] : ([xs] ++ ys) in 1 14. let (x:xs) : ys = ([x] ++ xs) : ys in 1 15. let (xs : ys) : zs = xs ++ (ys : zs) in 1 16. data F1 = F1 Int und data F2 = F2 !Int • x = case F1 ⊥ of F1 -> 1 • x = case F2 ⊥ of F2 -> 1 • y = case ⊥ of F1 -> 1 • y = case ⊥ of F2 -> 1 • x:: Int x = ⊥ x1 = case x of -> 1 Aufgabe IV.2: Kinds Bestimmt jeweils den kind der folgenden Typausdrücke. Gebt für Typausdrücke vom kind ∗ jeweils einen Wert dieses Typs an. 1. data T x = Nil | B (T x) (T x) 2. type N = T Char 3. type N = [] 4. data M x y = M x 5. data M x = M x 6. data M x y = M x y 7. data M x = M (x Int) 8. data M z x y = S (z x) (z y) 9. data M x = I (x (M x)) 10. data N s = Nil | S s 11. type N1 = M N (most recent M and N) 12. data T x y z = K (x -> y (z,x)) 13. data T x = T (x (T x)) Aufgabe IV.3: Rösselsprung Eine Springertour ist eine Menge von Zügen der Schachfigur Springer (Pferd), so dass die Figur alle Felder eines Schachbretts genau einmal besucht. Die Tour heißt geschlossen, wenn das letzte Feld das Ausgangsfeld bedroht. Implementiert eine Funktion in Haskell, die für ein Ausgangsfeld eines n × n Schachfelds eine geschlossene Springertour liefert (falls möglich).