• ## Exercise 2.3

Relevant definitions: area :: Shape -> Float area (Rectangle s1 s2) = s1 * s2 area (Polygon (v1 : vs) = polyArea vs where polyArea (v2 : v3 : vs’) = triArea v1 v2 v3 + polyArea (v3 : vs’) polyArea _ = 0 triArea :: Vertex -> Vertex -> Vertex -> Float triArea v1 […]

• ## Exercise 2.2

There are several ways to solve this problem. I used the approach of rotating around the origin incrementing the angle by 2Ï€/n each time. The radius of the figure is given by application of the sine rule to the isosceles triangle formed by two adjacent vertices and the origin. type Side = Float {- Construct […]

• ## Exercise 2.1

data Shape = … | Polygon [Vertex] … type Vertex = (Float, Float) rectangle :: Float -> Float -> Shape rectangle s1 s2 = Polygon [(x, y), (-x, y), (-x, -y), (x, -y)] where x = s1 / 2 y = s2 / 2 rtTriangle :: Float -> Float -> Shape rtTriangle s1 s2 = […]

• ## Exercise 1.3

simple x y z = x * (y + z) From what we have learnt so far: [(2, 3), (4, 5)] :: [(Integer, Integer)] [‘z’, 42] :: {- Error: different types cannot be mixed in a list -} (‘z’, -42) :: (Char, Integer) simple ‘a’ ‘b’ ‘c’ :: {- Error: simple cannot be called with […]

• ## Exercise 1.2

simple x y z = x * (y + z) simple (a – b) a b => (a – b) * (a + b) => (a * a) + (a * b) – (b * a) – (b * b) {- distributive law -} => (a * a) – (b * b) => a2 – […]

• ## Exercise 1.1

simple x y z = x * (y + z) simple (simple 2 3 4) 5 6 => simple (2 * (3 + 4)) 5 6 => simple (2 * 7) 5 6 => simple 14 5 6 => 14 * (5 + 6) => 14 * 11 => 154