8.18
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)) |