首页 > 解决方案 > 如何在 Racket 的合同退出条款中指定可选参数?

问题描述

鉴于我有一些带有签名的功能,如下所示

(define (my-method a [b 100])
    (/ a b)
 )

,我应该如何指定这样的签名contract-out

使用

(contract-out
          [my-method (-> number? number? number?)])

然后在另一个模块中

(my-method 200)

没有帮助,因为它发出错误说“违反合同,收到:1 个参数,预期:2 个非关键字参数”。而且我想我不能只将两个合同与可选的 using 结合起来or/c

标签: racketoptionalcontract

解决方案


首先使用->*并列出强制参数(在一个组中),然后是可选参数(在第二组中),然后是结果。还有更高级的选项;请参阅文档。

(contract-out
  [my-method
   (->* [number?]  ;; 1 mandatory argument
        [number?]  ;; 1 optional argument
        number?)])

这在 Racket Guide 的Contracts章节中进行了介绍,在名为Optional Arguments的部分中。


推荐阅读