問題 2.38

(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))

(define fold-right accumulate)

(define (fold-left op initial sequence)
  (define (iter result rest)
    (if (null? rest)
        result
        (iter (op result (car rest))
              (cdr rest))))
  (iter initial sequence))

(fold-right / 1 (list 1 2 3))
;予想 3/2
;-> 3/2
;ok

(fold-left / 1 (list 1 2 3))
;予想 1/6
;-> 1/6
;ok

(fold-right list null (list 1 2 3))
;予想 (1 (2 (3)))
;-> (1 (2 (3 ())))

;ハズレた。
;(list 3 null)
;-> (3 ())
;考えが浅かった。

(fold-left list null (list 1 2 3))
;予想 (((() 1) 2) 3)
;-> (((() 1) 2) 3)
;ok

;性質
;加算乗算など、作用される順番がかわっても問題のないもの。

(= (fold-right + 0 (list 1 2 3))
   (fold-left + 0 (list 1 2 3)))
;-> #t

(= (fold-right * 1 (list 1 2 3))
   (fold-left * 1 (list 1 2 3)))
;-> #t