使用自定义谓词定义球拍合同

时间:2018-11-18 12:53:56

标签: racket contract

我刚刚开始通过exercism.io了解合同,所以我签了一份合同:

[step1 (-> (and/c number?
                  less-than-one-hundred?)
            string?)]

认为我的意思是该函数将采用小于一百的数字(该函数定义为:

(define (less-than-one-hundred? n)
  (< n 100))

但是当我这样调用函数时:

(step1 100)

没有违反合同的情况。我在做什么错了?

2 个答案:

答案 0 :(得分:2)

仅在模块边界上执行合同。 这意味着,如果您的表达式polyfills.bundle.js与合同约定在同一个模块中,则不会检查输入。

但是,如果您导出带有合同的(step1 100),然后在另一个模块中导入step1并对其进行调用,则会检查该合同。

答案 1 :(得分:2)

这是Soegaard的回答说的一个具体例子:

def-step1.rkt

  this.setState({
        campus: e.target.value.map(school => school.value)
      });

use-step1.rkt

#lang racket

(provide (contract-out
          [step1 (-> (and/c number?
                            less-than-one-hundred?)
                     string?)]))

(define (less-than-one-hundred? n)
  (< n 100))

(define (step1 x) "")

这会产生您所期望的违反合同的行为,特别是,它责怪{em> #lang racket (require "def-step1.rkt") (step1 100) ,而不是use-step1.rkt所来自的合同的“合同方”:< / p>

def-step1.rkt