合同。如何接受任何匹配签名的函数?

问题描述 投票:0回答:1

我想写这样的合同:"接受一个至少接受一个参数,并返回一个布尔值的函数。"

最关键的是,我只关心它返回一个布尔值,并且它接受一个或多个参数--例如,它可以是一个接受一个参数的函数,或者一个接受2个参数的函数,任何一个都应该被接受。

这是我尝试过的。

第一次尝试:

(-> any/c any/c ... boolean?)

第二次尝试:

(->* (any/c)
     (any/c ...) ; => syntax error
     boolean?)

第三次尝试:

(->* (any/c)
     #:rest (listof any/c)
     boolean?)

在上述每一种情况下,合同似乎都希望该论点不仅仅包含在合同规范中,而是要在合同规定的范围内。匹配 它正是。也就是说,比如说,它 必须 是一个接受任意多参数的函数,而不是 "如果是一个接受2个参数的函数,那也没关系,因为我接受的是接受任意多参数的函数"。

如何写这样的合同呢?

racket datacontract contract
1个回答
1
投票

这能行吗?

(define/contract (f x)
  (and/c (unconstrained-domain-> boolean?)
         (lambda (p)
           (let loop ([n (procedure-arity p)])
             (match n
               [(? number? n) (>= n 1)]
               [(arity-at-least n) (>= n 1)]
               [(list xs ...) (ormap loop xs)]))))
  #t)
© www.soinside.com 2019 - 2024. All rights reserved.