Assignment 1 – Contracts
Due Fri 4/7 11:59pm
1. Add one (non-dependent) contract-out specification for this function and write three calls to sum such that one blames this module, one blames the calling module and one produces a result without any blame. In the code below, change only the any/c into some other contract (plus add a (require (submod "." sum)) and some calls to sum).
| #lang racket |
| (module sum racket |
| (provide |
| (contract-out |
| [sum any/c])) |
| (define (sum l) |
| (cond |
| [(empty? (rest l)) (first l)] |
| [else (+ (first l) |
| (sum (rest l)))]))) |
| (require (submod "." sum)) |
3. The following contract does not capture g’s behavior. Come up with an example call to g that results in a contract violation blaming the following module (which contains g).
| #lang racket |
| (module g racket |
| (provide |
| (contract-out |
| [g (-> (-> natural? natural?) |
| natural? |
| natural?)])) |
| (define (g f i) |
| (f (- (f i))))) |
4.
Not all calls to g trigger blame, however. Come up with a call to g that does not violate the contract.
5.
Come up with a new contract for g that is as general as you can, such that there are no arguments you can pass to g that will assign blame to g.
Submit a racket file with your solution via Canvas.