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

时间:2019-01-01 22:14:21

标签: racket

是否可以比较它们?例如,这不起作用:

(equal? (flat-contract integer?) (flat-contract integer?))

2 个答案:

答案 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)

  1. 首先,请注意函数flat-contract是用于向后兼容的,因此您可能不应该使用它。从文档中:

      

    此函数是使用谓词之前的保持时间   直接作为固定合同。今天存在倒退   兼容性。

  2. 因此,您的问题实际上是询问两个谓词是否相同。通常,由于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