首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(或/c #f <contract>) vs <contract>

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

Stack Overflow用户
提问于 2014-12-09 22:06:46
回答 1查看 116关注 0票数 2

根据Racket参考手册中的结构/直流入口中的以下示例,下面的bst/c函数返回一个契约,例如bt中的每个节点在lohi之间都有其值绑定。

代码语言:javascript
复制
(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定义为:

代码语言:javascript
复制
(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)]))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 22:47:28

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

代码语言:javascript
复制
 (bst 42 #f #f)

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

因为我们希望左右子树也是二进制搜索树,所以我们需要包含值#f作为合法的bst。合同(或/c #f .)只是这么说的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27389777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档