Recall reverse and add-at-end:

;; reverse : list-of-numbers -> list-of-numbers
(define (reverse l)
  (cond
    [(empty? l) empty]
    [else (add-at-end (first l) (reverse (rest l)))]))

;; add-at-end : number list-of-numbers -> list-of-numbers
(define (add-at-end ele l)
  (cond
    [(empty? l) (list ele)]
    [else (cons (first l) (add-at-end ele (rest l)))]))

Rewrite these functions, using fold:

;; fold : list-of-X Y (X Y -> Y) -> Y
(define (fold l base combine)
  (cond
    [(empty? l) base]
    [else (combine (first l) (fold (rest l) base combine))]))

For each use of fold, identify what X and Y from fold's type are.

 

Solution

(define (reverse l) (fold l empty add-at-end))
(define (add-at-end ele l) (fold l (list ele) cons))

In both cases, X is number and Y is list-of-numbers.