树形折叠定义与+和附加一起使用

时间:2016-02-21 00:15:15

标签: tree functional-programming scheme lisp fold

(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

1 个答案:

答案 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)