AufgabenLoesungen_Tag9.hs ProInformatik:Funktionale Programmierung, Musterlösung Tag 9 -- 10.1 produceBill = id formatBill = id printBill = putStr . formatBill . produceBill --printBill2 = produceBill >.> formatBill >.> putStr -- 10.2 {id . f ist eine Komposition: Erst wird die Funktion f ausgeführt und auf das Ergebnis id: Das Ergebnis ist im Grunde ein Aufruf von f wenn f :: Int -> Bool, dann ist id Bool -> Bool f . id ist eine Komposition: Erst wird die Funktion id ausgeführt und auf das Ergebnis f: Das Ergebnis ist im Grunde ein Aufruf von f wenn f :: Int -> Bool, dann ist id Int -> Int id f ist der Aufruf von id auf die Funktion f: Es wird genau diese Funktion zurückgegeben wenn f :: Int -> Bool, dann ist id (Int -> Bool) -> (Int -> Bool) Wenn f id ein korrekter Ausdruck ist, ist f :: (a -> a) -> b -} -- 10.3 composeList :: [(a -> a)] -> a -> a composeList = foldl (.) id -- Signatur: Zweiter Parameter frei wählbar: a; erster Parameter muss eine Liste aus Funktionen sein. Allerdings müssen sie kompositionierbar sein. Daher müssen alle Funktionen a -> a haben. Heraus kommt daher ein a -- 10.4 {iter 3 double 1 = (double . iter 2 double) 1 (double . (double . iter 1 double)) 1 (double . (double . (double . iter 0 double))) 1 (double . (double . (double . id))) 1 double . double . double 1 double . double 2 double 4 8 -} -- 10.5 -- lambda :: Int -> (a -> a) -- gibt den n-ten Nachfolger einer Variablen aus (tatsächlich gibt es nur die Funktion aus, diesen zu berechnen...) -- 10.6 -- \f b a -> f a b -- 10.7 flip2 :: (a -> b -> c) -> (b -> a -> c) flip2 f = \a b -> f b a -- 10.8 whitespace :: [Char] whitespace = " \t\n" Page 1 AufgabenLoesungen_Tag9.hs nonWhiteSpace :: Char -> Bool nonWhiteSpace = \c -> (not . (`elem` whitespace)) c -- 10.9 total :: (Int -> Int) -> (Int -> Int) total f = \n -> (sum . (map f)) [0..n] -- 10.12 comp2 :: (a -> b) -> (b -> b -> c) -> a -> (a -> c) comp2 f g x = g (f x) . f -- zugegeben... geschummelt, damit ich ja kein x und y verwende. comp3 :: (a -> b) -> (b -> b -> c) -> (a -> a -> c) comp3 f g = comp2 f g total2 :: (Int -> Int) -> (Int -> Int) total2 f = sum . (map f) . (flip take [0..]) . succ -- 10.13 operatorsections = map (+1) . filter (>=0) -- 10.14 type Picture = [[Char]] chessBoard :: Int -> Picture chessBoard n = makePicture n n [ (x,y) | x <- [0..n], y <- [0..n], even (x+y) ] -- 10.15 type BoolPicture = [[Bool]] invertColour = map invertLine where invertLine = map invertBool invertBool = not invertColourOneLine = map (map not) superimpose = zipWith superimposeLine where superimposeLine = zipWith superimposeBool superimposeBool = (||) superimposeOneLine = zipWith (zipWith (||)) printPictureBool = putStr . concat . (map (++"\n")) . (map (map toChar)) toChar bool | bool = '#' | otherwise = '.' -- 10.16 makePicture :: Int -> Int -> [(Int, Int)] -> Picture makePicture width height blacklist = [ [toChar (elem (x-1,y-1) blacklist) | y <- [1..width] ] | x <- [1..height] ] makePictureFromRep (width, height, blacklist) = makePicture width height blacklist Page 2 AufgabenLoesungen_Tag9.hs -- 10.17 type Rep = (Int, Int, [(Int, Int)]) printPicture = putStr . concat . (map (++"\n")) pictureToRep :: Picture -> Rep pictureToRep pic = (width, height, [ (x,y) | x <- [0..height-1], y <[0..width-1], pic!!x!!y == '#' ]) where width = length (head pic) height = length pic -- 10.18 rotate90 :: Rep -> Rep rotate90 (width, height, blacklist) = (height, width, [ (y,height-x-1) | (x,y) <- blacklist ]) reflectV :: Rep -> Rep reflectV (width, height, blacklist) = (width, height, [(x,width-y-1) | (x,y) <- blacklist]) reflectH :: Rep -> Rep reflectH (width, height, blacklist) = (width, height, [(height-x-1,y) | (x,y) <- blacklist]) superimposeRep :: Rep -> Rep -> Rep superimposeRep (width1, height1, blacklist1) (width2, height2, blacklist2) = (width1, height1, [(x,y) | (x,y) <- unique (blacklist1 ++blacklist2) ]) unique [] = [] unique (x:xs) | elem x xs = unique xs | otherwise = x:unique xs Page 3