Для определенных видов договоров вы можете использовать contract-equivalent?
:
> (contract-equivalent? (flat-contract integer?) (flat-contract integer?))
#true
> (contract-equivalent? (and/c integer? positive?) (and/c integer? positive?))
#true
> (contract-equivalent? (or/c integer? string?) (or/c string? integer?))
#true
Возвращает #true
, когда система договоров может доказать, что они эквивалентны.
Однако, как отмечается в документации, результат #false
не означает, что они не эквивалентны, он просто означает, что он не знает:
Эта функция консервативна, поэтому может возвращать #false
, когда c1
фактически принимает тот же набор значений, что и c2
.
> (contract-equivalent? integer? integer?)
#true
> (contract-equivalent? (lambda (x) (integer? x))
(lambda (x) (integer? x)))
#false