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. Solution. 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. ____________________ Racket Users list: http://lists.racket-lang.org/users