[racket] missing solution 20.2.4 ex:fancy-contracts-poly

From: Daniel Bastos (dbastos at toledo.com)
Date: Thu Sep 4 12:54:57 EDT 2014

A candidate for a solution. (I'm not sure I'm correct regarding the
function project. The description says "a lists of lists" (which I
translate to (listof ITEM)) and "a function from lists to Xs", so I
wonder if the domain of this function-argument must be (listof ITEM)
or it could be more general such as (listof Y). I decided to imagine
that the domain of the function-argument would be items of the "list
of lists" and so I made it into (listof ITEM).

Thank you for your attention.

Exercise 20.2.4. Formulate general contracts for
the following functions:

1. sort, which consumes a list of items and a
function that consumes two items (from the list)
and produces a boolean; it produces a list of items.

2. map, which consumes a function from list items
to Xs and a list; it produces a list of Xs.

3. project, which consumes a list of lists and a
function from lists to Xs; it produces a list of Xs.

Compare with exercise 20.2.2.


sort: (listof ITEM) (ITEM ITEM -> boolean) -> (listof ITEM)

map: ((listof ITEM) -> X) (listof ITEM) -> (listof X)

project: (listof (listof ITEM)) ((listof ITEM) -> (listof X)) -> (listof X)

(*) Comparison with exercise 20.2.2

For sort, we replaced number with X. So we generalized the type
of the list which we sort. The new procedure can sort a generic list.

For map, we generalized both the domain and co-domain of
the function consumed by map. Before, the consumed function
was only a mapping from numbers to numbers and now it is
a mapping from a generic domain ITEM to a generic co-domain X.

For project, we generalized the type of the list of lists. It was of
type symbol and now it can be a list of lists of any kind of item.

Posted on the users mailing list.