【发布时间】:2017-06-27 12:27:14
【问题描述】:
我正在浏览球拍指南并刚刚完成此页面:
https://docs.racket-lang.org/guide/contracts-first.html
而由此产生的合同非常复杂,我简直不敢相信自己的眼睛:
(provide
(contract-out
[argmax
(->i ([f (-> any/c real?)] [lov (and/c pair? list?)]) ()
(r (f lov)
(lambda (r)
(cond
[(empty? (rest lov)) (eq? (first lov) r)]
[else
(define f@r (f r))
(define flov (map f lov))
(and (is-first-max? r f@r (map list lov flov))
(dominates-all f@r flov))]))))]))
我敢打赌,这份合约的复杂性远高于所需的实际实施,尽管这份合约实际上并没有透露任何实施细节。更让我困惑的是,合约甚至不是编译时组件,就像 Curry-Howard 同构通过类型系统证明属性一样,所以它在任何意义上都不是经过认证的编程方法,并且肯定会带来运行时效果。鉴于这种复杂程度,我认为进行契约没有任何好处,比如一些简单的数据类型检查,我认为这更有意义。
您能否指出我缺少关于此类合同的必要性的地方?r
【问题讨论】:
-
这种类型的合约本质上是“添加更多代码来保护代码”的困境,但是你如何保证你添加的代码没有错误?