【问题标题】:What's the purpose of convoluted racket contract?错综复杂的球拍合同的目的是什么?
【发布时间】: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

【问题讨论】:

  • 这种类型的合约本质上是“添加更多代码来保护代码”的困境,但是你如何保证你添加的代码没有错误?

标签: racket contract


【解决方案1】:

这是文档;文档的重点是尽可能多地涵盖合同系统的功能。

假设我烤结婚蛋糕。我想向你展示你的婚礼蛋糕上可以有什么样的东西,所以我用你可能做的所有装饰做了一个蛋糕,然后把它放在一个简单的底座上——甚至是一块纸板。你会不会看着这个蛋糕抱怨它太花哨?不,关键是这是一个功能菜单;阅读本文档后,您应该能够理解所有不同部分的作用。

【讨论】:

  • 这并没有真正解释它。这是一本入门指南,而不是一些深入的书。此外,此功能是一个现有的服务,就像一个现实生活中的例子一样。如果示例不是以务实的方式构建的,我相信很多人会发现合同是不必要的。
  • 也许您有更好的例子?如果您能为文档做出贡献,那就太好了!
【解决方案2】:

您链接到的页面开始:

7.4 合同:一个完整​​的例子

本节为一个和一个开发了几种不同风格的合同 同样的例子:Racket 的 argmax 函数。

最后的味道是最彻底的(“复杂的”)。

您似乎认为该页面试图让您相信合同是“必需品”。我不这么认为。我看到它解释了合同可能做什么——如果/作为/当您认为收益超过成本时。如果你认为永远不会,那很好。

不管怎样,我已经阅读了相当多的 Racket 代码,而且我很少见过如此复杂的合约。此外,Racketeers 很清楚合约有运行时成本。人们通常只在重要的“边界”上使用它们。

最后,如果你更喜欢静态类型,你可能更喜欢 Typed Racket。请注意,您可以混合使用动态和静态类型的 Racket 模块。为确保静态类型不变量,边界受...合约保护。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多