Вот конкретный пример того, что говорит ответ Сойгаарда:
DEF-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) "")
потребительная step1.rkt
#lang racket
(require "def-step1.rkt")
(step1 100)
Это приводит к нарушению контракта, как вы ожидаете, и, в частности, обвиняет use-step1.rkt
, иная «сторона договора», чем def-step1.rkt
, откуда пришел контракт:
step1: contract violation
expected: less-than-one-hundred?
given: 100
in: an and/c case of
the 1st argument of
(->
(and/c number? less-than-one-hundred?)
string?)
contract from: .../def-step1.rkt
blaming: .../use-step1.rkt
(assuming the contract is correct)