めも
■ foldとreduce
reduceはfoldより1回関数呼び出しが少ない
guile> (fold (lambda (x y) (display (list x y)) (newline) (+ x y)) 0 '(1 2 3 4)) (1 0) (2 1) (3 3) (4 6) 10 guile> (reduce (lambda (x y) (display (list x y)) (newline) (+ x y)) 0 '(1 2 3 4)) (2 1) (3 3) (4 6) 10 guile> (fold (lambda (x y) (display (list x y)) (newline) (+ x y)) 2 '(1 2 3 4)) (1 2) (2 3) (3 5) (4 8) 12 guile> (reduce (lambda (x y) (display (list x y)) (newline) (+ x y)) 2 '(1 2 3 4)) ;; 正しくない使い方 (2 1) (3 3) (4 6) 10
reduce第2引数ridentityは(f ridentity x) = xでないといけない
普通は使わないけど,reduceの第3引数のlistが空のときのみ返される.以下は実験用の不正なコード.
guile> (reduce (lambda (x y) (display (list x y)) (newline) (+ x y)) #t '(1 2)) y)) #t '(1 2)) (2 1) 3 guile> (reduce (lambda (x y) (display (list x y)) (newline) (+ x y)) #t '(1)) y)) #t '(1)) 1 guile> (reduce (lambda (x y) (display (list x y)) (newline) (+ x y)) #t '()) y)) #t '()) #t
1.130 sec

