检查和比较两个球拍合约?

JRR*_*JRR 1 racket

有没有办法比较它们?例如,这不起作用:

(equal? (flat-contract integer?) (flat-contract integer?))
Run Code Online (Sandbox Code Playgroud)

Ale*_*uth 5

对于某些类型的合同,您可以使用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
Run Code Online (Sandbox Code Playgroud)

#true当合同系统证明它们是等价的时,这将返回.

但是,正如文档所指出的那样,#false结果并不意味着它们等同,它只是意味着它不知道:

这个函数是保守的,所以#falsec1它实际上接受同一组值时它可能会返回c2.

> (contract-equivalent? integer? integer?)
#true
> (contract-equivalent? (lambda (x) (integer? x))
                        (lambda (x) (integer? x)))
#false
Run Code Online (Sandbox Code Playgroud)