Exercise2-38 <---> Exercise2-40
Exercise 2.39
Complete the following definitions of reverse (exercise 2.18) in terms of fold-right and fold-left from exercise 2.38:
(define (reverse sequence) (fold-right (lambda (x y) <??>) nil sequence)) (define (reverse sequence) (fold-left (lambda (x y) <??>) nil sequence))
Scheme solution:
(define (reverse sequence)
(fold-right (lambda (x y) (append y (list x))) '() sequence))
(define (reverse sequence)
(fold-left (lambda (x y) (cons y x)) '() sequence))
Haskell solution:
reverse sequence = foldr (\x y -> y ++ [x]) [] sequence
reverse sequence = foldl (\x y -> y : x) [] sequence
OCaml solution:
let reverse sequence = List.fold_right (fun x y -> y @ [x]) sequence []
let reverse sequence = List.fold_left (fun x y -> y :: x) [] sequence
Standard ML solution:
fun reverse sequence = foldr (fn (x, y) => y @ [x]) [] sequence
fun reverse sequence = foldl op :: [] sequence
(* equivalent to: foldl (fn (y, x) => y :: x) [] sequence *)
Exercise2-38 <---> Exercise2-40