#| Sigma : list-of-numbers -> number Purpose: add the nunbers in alon (define (Sigma alon) ... ) Examples: (Sigma (list 1 2 3)) = 6 (Sigma (list 10 2 13)) = 25 |# |
#| Pi : list-of-numbers -> number Purpose: multiply the nunbers in alon (define (Pi alon) ... ) Examples: (Pi (list 1 2 3)) = 6 (Sigma (list 10 2 13)) = 260 |# |
(define (Sigma alon) (cond ((empty? alon) 0) (else (+ (first alon) (Sigma (rest alon)))))) |
(define (Pi alon) (cond ((empty? alon) 1) (else (* (first alon) (Pi (rest alon)))))) |
Now abstract over the two: | |
(define (F base combine alon) (cond ((empty? alon) base) (else (combine (first alon) (F base combine (rest alon)))))) | |
How do we get back Sigma and Pi: | |
(define (Sigma alon) (F 0 + alon)) |
(define (Pi alon) (F 1 * alon)) |
;; smallest : alon [not empty] -> number ;; Purpose: finds smallest number in non-empty list (define (smallest alon) (F (first alon) min alon))
;; demands-going-up : number alon -> alon ;; Purpose: filters out all those n's in alon that are larger than number (define (demands-going-up cf alon) (local ((define (greater-than f rst) (cond ((> f cf) (cons f rst)) (else rst)))) (F empty greater-than alon)))
;; project : db -> list-of-symbols ;; Purpose: it produces the names of those employees in a-db ;; who earn more than $1000000 (as a list) (define (project a-db) (local ((define (more-than-100000 f rst) (cond ((> (pr-salary f) 1000000) (cons f rst)) (else rst)))) (F empty more-than-100000 a-db)))Wow: F now consumes a list of personnel records, not just a list of numbers. How can that be?
A list-of-numbers is either - empty or - (cons N L) where N is a number and L is a list-of-numbers. |
A list-of-PRs is either - empty or - (cons N L) where N is a PR and L is a list-of-PRs. |
Now abstract over the two: | |
A list-of-XYZs is either - empty or - (cons N L) where N is a XYZ and L is a list-of-XYZs. |
Matthias Felleisen | This page was generated on Fri Apr 9 09:17:38 CDT 1999. |