(或/ c #f <contract>)vs <contract> </contract> </contract>

时间:2014-12-09 22:06:47

标签: racket design-by-contract

根据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

1 个答案:

答案 0 :(得分:4)

具有单个值的二叉搜索树构造为:

 (bst 42 #f #f)

这里#f用于表示左右子树是空的。

由于我们希望左右子树也是二叉搜索树,我们需要将值#f包含为合法的bst。合同(或/ c #f ......)就是这么说的。