根据下面的例子来自struct/dc entry在 Racket 引用手册中,下面的 bst/c
函数返回一个合约,例如 bt
中的每个节点都有其值绑定(bind)在 lo
和 嗨
。
(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 [...])
构造的目的是什么?由于#f 是一个始终为 false 的常量,为什么不完全删除 or/c 逻辑,并简单地定义 bst/c如:
(define (bst/c lo hi)
(struct/dc bt
[val (between/c lo hi)]
[left (val) #:lazy (bst lo val)]
[right (val) #:lazy (bst val hi)]))
最佳答案
具有单个值的二叉搜索树构造如下:
(bst 42 #f #f)
这里#f用来表示左右子树为空。
由于我们希望左右子树也成为二叉搜索树,因此我们需要包含值 #f 作为合法的 bst。契约(Contract)(或/c#f ...)就是这样说的。
关于racket - (或/c#f <合约>) 与 <合约>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389777/