在树中循环并对racket中的所有值求和?

在树中循环并对racket中的所有值求和?,racket,Racket,我试图编写一些通用方法,它使用两个参数(树、函数)在树节点上迭代,并将树节点传递给方法 例如,我有一个名为fold的方法,它将二叉搜索树作为第一个参数,函数作为第二个参数,而参数方法则使用四个参数(键值left node key right node key) 下面是一些可以传递给上述foldmethod的方法: 第一种方法可以是sumAll (define (sumAll key value leftValue rightValue) (if (null? key) 0

我试图编写一些通用方法,它使用两个参数(树、函数)在树节点上迭代,并将树节点传递给方法 例如,我有一个名为fold的方法,它将二叉搜索树作为第一个参数,函数作为第二个参数,而参数方法则使用四个参数(键值left node key right node key)

下面是一些可以传递给上述
fold
method的方法: 第一种方法可以是
sumAll

(define (sumAll key value leftValue rightValue)
  (if (null? key) 
      0 
      (+ key leftValue rightValue) 
  )
)
第二种方法可以是
findminium

(define (findMinimum key value leftValue rightValue)
  (if (null? key)
      '()
      (if (null? leftValue)
          key
          leftValue
      )
  )
)
使用:

但我从fold方法中得到了这个错误:

+: contract violation
  expected: number?
  given: '()
  argument position: 2nd
  other arguments...:

任何关于我为什么会犯这个错误的线索

通过接受任何过程proc和基本case值init,您可以使
折叠
足够抽象,并让过程在所有节点上应用参数函数,如下所示:

(define (fold proc init lst)
  (cond
    [(null? lst) init]
    [else
     (proc (car lst)
           (fold proc init (caddr lst))
           (fold proc init (cadddr lst)))]))
然后,使用以下二进制搜索树示例定义:

(define BST '(20 "20" (18 "18" () (19 "19" () ())) (21 "21" (15 "15" () ()) ())))
您可以使用以下步骤:

(fold + 0 BST)                             ; find sum
=> 93
(fold min 1000 BST)                        ; find min
=> 15
(define BST '(20 "20" (18 "18" () (19 "19" () ())) (21 "21" (15 "15" () ()) ())))
(fold + 0 BST)                             ; find sum
=> 93
(fold min 1000 BST)                        ; find min
=> 15