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)