假设我为一个集合定义了一个结构,它的 "中心"。
(struct centered-set (center elems))
我想保证以下条件。
elems
是一个集合。center
是一个成员 elems
.我可以用以下条件来表达 #:guard
. 有没有一种方法可以像合同一样表达条件?
对于函数。->i
作为这种依赖性合约的组合器。如何表达结构的从属合约?
IIUC, contract-out
不支持任何类似的功能。但是,你可以通过手动提供构造函数和访问器,并附加合同来模拟这个功能。
#lang racket
(module foo racket
(provide (contract-out [bt (-> any/c any/c any/c (bst/c 1 10))]
[bt-val (-> (bst/c 1 10) any/c)]
[bt-left (-> (bst/c 1 10) any/c)]
[bt-right (-> (bst/c 1 10) any/c)]))
(define (bst/c lo hi)
(or/c #f
(struct/dc bt
[val (between/c lo hi)]
[left (val) #:lazy (bst/c lo val)]
[right (val) #:lazy (bst/c val hi)])))
(struct bt (val left right)))
(require 'foo)
(bt 11 #f #f)
应该可以写一个 提供变压器 以实现这一过程的自动化。