Racket中结构的附属合同

问题描述 投票:0回答:1

假设我为一个集合定义了一个结构,它的 "中心"。

(struct centered-set (center elems))

我想保证以下条件。

  • elems 是一个集合。
  • center 是一个成员 elems.

我可以用以下条件来表达 #:guard. 有没有一种方法可以像合同一样表达条件?

对于函数。->i 作为这种依赖性合约的组合器。如何表达结构的从属合约?

racket contract
1个回答
1
投票

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)

应该可以写一个 提供变压器 以实现这一过程的自动化。

© www.soinside.com 2019 - 2024. All rights reserved.