8.14
Map Examples
| `#lang typed/racket | 
| (require typed/rackunit) | 
| ;; given a number and a list of numbers, return the result | 
| ;; of multiplying every number in the list by the given number: | 
| ;; First, let's try with the design recipe: | 
| (define (mm-1 [num : Real] [lon : (Listof Real)]) : (Listof Real) | 
| (match lon | 
| ['() '()] | 
| [(cons f r) (cons (* num f) (mm-1 num r))])) | 
| ;; Next, let's use `map` for this, defining a function to use | 
| ;; with map, inside of the function: | 
| (define (mm-2 [num : Real] [lon : (Listof Real)]) : (Listof Real) | 
| (define (my-mult [b : Real]) | 
| (* num b)) | 
| (map my-mult lon)) | 
| ;; Is there a way to abbreviate this? I don't really want to give `my-mult` a name. | 
| ;; yes! | 
| (define (mm-3 [num : Real] [lon : (Listof Real)]) : (Listof Real) | 
| (map (λ ([b : Real]) : Real (* num b)) lon)) | 
| ;; that seems long. Can I omit some of the types on the unnamed function? | 
| ;; yes, the return type of this function can be inferred. That's a bit shorter: | 
| (define (mm-4 [num : Real] [lon : (Listof Real)]) : (Listof Real) | 
| (map (λ ([b : Real]) (* num b)) lon)) | 
| ;; Is there another form that I could use for this? | 
| ;; Yes: in this case, a `for/list` would work fine: | 
| (define (mm-5 [num : Real] [lon : (Listof Real)]) : (Listof Real) | 
| (for/list ([b lon]) | 
| (* num b))) | 
| ;; Hey! I tried the for/list in my situation, and TR was unable to | 
| ;; infer the type of `b`. Can I specify it manually? | 
| ;; Yes: | 
| (define (mm-6 [num : Real] [lon : (Listof Real)]) : (Listof Real) | 
| (for/list ([b : Real lon]) | 
| (* num b))) | 
| (check-equal? (mm-1 100 '(3 4 5)) '(300 400 500)) | 
| (check-equal? (mm-2 100 '(3 4 5)) '(300 400 500)) | 
| (check-equal? (mm-3 100 '(3 4 5)) '(300 400 500)) | 
| (check-equal? (mm-4 100 '(3 4 5)) '(300 400 500)) | 
| (check-equal? (mm-5 100 '(3 4 5)) '(300 400 500)) | 
| (check-equal? (mm-6 100 '(3 4 5)) '(300 400 500)) |