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 = Polygon [(0, 0),  (s1, 0), (0, s2)]

My rectangle is centred on the origin, with vertices in anticlockwise order, to match up with what’s coming in future chapters and exercises.

7 Responses to “Exercise 2.1”

  1. […] Note that the vertex list is in anticlockwise order. This is also the case with Exercise 2.1. […]

  2. Howard Lewis Ship says:

    My solution was similar (didn’t bother with centering on origin), however I declared the parameter types (is that the right term in Haskell?) as Side, not Float … i.e. rectangle :: Side -> Side -> Shape

  3. Giarome says:

    In my point of view, it is clockwise!

  4. Derek Mahar says:

    Howard, I don’t think “rectangle :: Side -> Side -> Shape” is correct because Vertex is defined as “(Float, Float)”.

  5. Joshua Nahum says:

    Howard is correct, “rectangle :: Side -> Side -> Shape” matches the data definition, as Rectangle doesn’t take a tuple.

  6. linder says:

    But Rectangle is not the constructor that the exercise wants you to use. The exercise asks you to make a rectangle using the Polygon constructor, which takes a list of vertices. You could make a rectangle with two vertices if they are diagonal. Perhaps it would be helpful to reproduce the exercise that is being solved, to avoid confusion.

  7. Doug says:

    The definition of a rectangle does not require that one side be parallel to the y axis. Wikipedia : In Euclidean plane geometry, a rectangle is any quadrilateral with four right angles. The text does not seem to consider rotated shapes as belonging to the Shape type.

Leave a Reply