Racket中结构的依赖契约
假设我为一个具有“中心”的集合定义了一个结构 我想保证以下条件Racket中结构的依赖契约,racket,contract,Racket,Contract,假设我为一个具有“中心”的集合定义了一个结构 我想保证以下条件 elems是一个集合 center是elems的成员 我可以用#:guard表示条件。有没有办法表达与合同相同的条件 对于函数,->i作为这种依赖契约的组合器工作。如何表示结构的依赖契约?IIUC,contract out不支持类似的东西。但是,您可以通过手动提供构造函数和访问器以及附加的合同来模拟功能: #lang racket (module foo racket (provide (contract-out [bt
是一个集合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)
应该可以编写一个自动化流程。查看@SoraweePorncharoenwase谢谢。就我所见,
struct/dc
用于接受struct实例的契约。我想在结构上施加契约,比如(契约输出[struct…])
。
#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)