根据Racket参考手册中struct/dc entry的以下示例,下面的bst/c
函数返回一个合约,例如bt
中的每个节点的值都绑定在{{1}之间}和lo
。
hi
这个定义看起来很完美,除了一件事:(struct bt (val left right))
(define (bst/c lo hi)
(or/c #f
(struct/dc bt
[val (between/c lo hi)]
[left (val) #:lazy (bst lo val)]
[right (val) #:lazy (bst val hi)])))
构造的目的是什么?由于(or/c #f [...])
是一个常量计算为false的常量,为什么不完全删除#f
逻辑,只需将or/c
定义为:
bst/c
答案 0 :(得分:4)
具有单个值的二叉搜索树构造为:
(bst 42 #f #f)
这里#f用于表示左右子树是空的。
由于我们希望左右子树也是二叉搜索树,我们需要将值#f包含为合法的bst。合同(或/ c #f ......)就是这么说的。