racket - (或/c#f <合约>) 与 <合约>

标签 racket design-by-contract

根据下面的例子来自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/

相关文章:

java - java 中的参数检查或契约设计 (GWT)。从哪儿开始?

python - 在 Python 中使用契约式设计

list - 使用参数评估 Racket 中的列表

image - pict 中的 hb-append vs hbl-append 和 ht-append vs htl-append

scheme - 自由标识符=之间的区别?和边界标识符=?

language-agnostic - 我需要一个基本的具体示例来说明如何将 TDD 与按契约(Contract)设计一起使用

java - 如何通过 Cofoja 使用离线字节码编写器?

design-by-contract - 契约(Contract)设计中的编译时间检查?

scheme - 使用 `map` 的 Racket 计数出现次数

macros - 宏内的 RackUnit 源位置