(define (tree-fold f tree)
(if (pair? tree)
(apply f (car tree) (map (lambda (t) (tree-fold f t)) (cdr tree)))
(f tree)))
例如:(tree-fold + '(1 (2 2)(2 2))
- > 9
但是,如果我想使用(tree-fold append '(1 (2 2)(2 2)))
,
我必须在tree-fold
周围list
修改(car tree)
,
这打破了+
。
是否有一些机制可以在tree-fold
定义中使用,以使其适用于+
和append
?
答案 0 :(得分:2)
这应该有效,添加一个参数来初始化结果:
(define (tree-fold f n sxp)
(let loop ((sxp sxp) (res n))
(cond
((null? sxp) res)
((pair? sxp) (loop (car sxp) (loop (cdr sxp) res)))
(else (f sxp res)))))
测试:
> (tree-fold + 0 '(1 (2 2)(2 2)))
9
> (tree-fold cons '() '(1 (2 3)(4 5)))
'(1 2 3 4 5)