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.