SICP問題2.38

fold-right, fold-leftの定義(教科書で定義済)

(define (fold-right op initial sequence)
  (accumulate op initial sequence))

(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))

(fold-right / 1 (list 1 2 3))
; 1 / (2 / (3 / 1))
; => 3/2

(fold-left / 1 (list 1 2 3))

(fold-left / 1 (list 1 2 3))
; (iter 1 (1 2 3))
; (iter (/ 1 1) (2 3))
; (iter (/ 1 2) (3))
; (iter (/ (1/2) 3) ())
; => 1/6

(fold-right list () (list 1 2 3))

(fold-right list () (list 1 2 3))
; (list 1 (list 2 (list 3 (list ()))))
; => (1 (2 3 ()))

(fold-left list () (list 1 2 3))

(fold-left list () (list 1 2 3))
; (iter () (1 2 3))
; (iter (list () 1) (2 3))
; (iter (list (() 1) 2) (3))
; (iter (list (() 1) 2) 3) ())
; => (() 1) 2) 3)

fold-rihgt と fold-left がどのような並びに対しても同じ値を生じるためにopが満たすべき性質は何か?

  • 演算結果がリストでなくスカラー値であること。
  • 和、積のように演算結果が演算順序に関係ないもの。