
Exercise 5.4
Assume that f2 = map. Then: f1 :: [a > a] > a > [a] f1 fs x = map (\f > f x) fs Or in one line: (\fs x > map (\f > f x) fs) (map (*) [1,2,3,4]) 5 => [5,10,15,20]

Exercise 5.3
Note: Anonymous functions are not introduced until chapter 9! But they are an easy way to solve problems like this. mylength :: [a] > Int mylength xs = foldl (\x _ > x + 1) 0 xs

Exercise 5.2
map map [x] = [map x] Therefore: x :: a > b because x is the first argument to map. Consider the type of map: map :: (a > b) > [a] > [b] This implies: map x :: [a] > [b] [map x] :: [[a] > [b]] And hence: map map :: [a > […]

Exercise 5.1
Recall the definitions from Exercise 2.3. area’ :: Shape > Float area’ (Polygon (v1:vs)) = let arealist = map (\(v2, v3) > triArea v1 v2 v3) (zip vs (tail vs)) in foldl (+) 0 arealist (zip vs (tail vs)) turns out to be a handy idiom.

Exercise 4.2
From the text: intToFloat :: Int > Float intToFloat i = fromInteger (toInteger i) The exercise: pixelToInch :: Int > Float pixelToInch x = intToFloat x / 100 { pixelToInchBad :: Int > Float pixelToInchBad x = intToFloat (x / 100) } pixelToInchBad :: Int > Float pixelToInchBad x = intToFloat (x `div` 100) Apart […]

Exercise 4.1
inchToPixel :: Float > Int inchToPixel x = round (100 * x) inchToPixelBad :: Float > Int inchToPixelBad x = 100 * round x The second definition is bad because rounding a small floating point number leads to a loss of precision in the integer. Better to multiply by 100 first, before rounding. For example, […]

Exercise 3.2
From the text: spaceClose :: Window > IO () spaceClose w = do k Int mulcos30 n = n * 86603 `div` 100000 equiTri :: Color > Window > Int > Int > Int > Int > IO () equiTri color w x y yorient size = let halfsize = size `div` 2 height = […]

Exercise 3.1
myPutStr :: String > IO () myPutStr [] = return () myPutStr (c : cs) = do putChar c myPutStr cs myGetLine :: IO String myGetLine = do c

Exercise 2.5
{ Area of a shape: compute by adding up the trapezoidal areas formed by pair of vertices with the xaxis. This can (correctly) be negative when x2 > x1. } axisTrapezoidArea :: Vertex > Vertex > Float axisTrapezoidArea (x1, y1) (x2, y2) = (x1 – x2) * (y1 + y2) * 0.5 area :: Shape […]

Exercise 2.4
{ Is a shape convex: compute the cross product of the two vectors formed by each 3 vertices – a convex shape will have all the cross products the same sign. } crossProduct :: Vertex > Vertex > Vertex > Float crossProduct (x1, y1) (x2, y2) (x3, y3) = (x2 – x1) * (y3 – […]