AufgabenLoesungen_Tag9.hs ProInformatik:Funktionale

Werbung
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
Herunterladen