是否可以比较它们?例如,这不起作用:
(equal? (flat-contract integer?) (flat-contract integer?))
答案 0 :(得分: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
当合同系统可以证明它们等效时,它将返回#true
。
但是,如文档所述,#false
的结果并不意味着它们不是等效的,而只是意味着它不知道:
此函数是保守的,因此实际上
#false
接受与c1
相同的一组值时,它可能返回c2
。
> (contract-equivalent? integer? integer?)
#true
> (contract-equivalent? (lambda (x) (integer? x))
(lambda (x) (integer? x)))
#false
答案 1 :(得分:4)
首先,请注意函数flat-contract
是用于向后兼容的,因此您可能不应该使用它。从文档中:
此函数是使用谓词之前的保持时间 直接作为固定合同。今天存在倒退 兼容性。
因此,您的问题实际上是询问两个谓词是否相同。通常,由于halting problem,无法确定此问题。但是,出于您的目的,您也许可以摆脱参照相等性。
> ;; both are in the same memory address
(eq? integer? integer?)
#t
> ;; obviously not in the same memory address
(eq? integer? real?)
#f
请注意其警告
> ;; although they look the same syntactically,
;; the function objects are in different memory address
(eq? (lambda (x) x) (lambda (x) x))
#f
> (define x (lambda (x) x))
> (define y x)
> ;; both are in the same memory address
(eq? x y)
#t
> ;; flat-contract creates a function in a new memory address
(eq? (flat-contract integer?) (flat-contract integer?))
#f