Racket 什么';复杂的球拍合同的目的是什么?

Racket 什么';复杂的球拍合同的目的是什么?,racket,contract,Racket,Contract,我正在浏览球拍指南,刚刚完成本页: 由此产生的合同如此复杂,我简直不敢相信自己的眼睛: (provide (contract-out [argmax (->i ([f (-> any/c real?)] [lov (and/c pair? list?)]) () (r (f lov) (lambda (r) (cond [(empty? (rest lov)) (eq

我正在浏览球拍指南,刚刚完成本页:

由此产生的合同如此复杂,我简直不敢相信自己的眼睛:

(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同构通过类型系统证明属性一样,因此它在任何意义上都不是经过认证的编程方法,并且肯定具有运行时效果。在这种复杂程度下,我看不到做契约的好处,比如说一些简单的数据类型检查,我认为这更有意义


你能指出我对这种合同的必要性有何遗漏吗?这是文件;文件的要点是尽可能多地涵盖合同系统的特征


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

这是文档;文件的要点是尽可能多地涵盖合同系统的特征


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

您链接到的页面开始:

7.4合同:一个彻底的例子

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

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

你似乎认为该页面试图让你相信合同是“必要的”。我看不出来。我看到它解释了如何处理合同——如果你认为收益超过成本。如果你从不相信,那很好

值得一提的是,我已经阅读了大量的敲诈勒索代码,而且我很少看到如此复杂的合同。此外,敲诈勒索者很清楚合同有运行成本;通常人们只在重要的“边界”使用它们


最后,如果您喜欢静态类型,您可能更喜欢类型化的Racket。请注意,您可以混合动态和静态类型的球拍模块。为了确保静态类型不变量,边界由。。。合同。

您链接到的页面开始:

7.4合同:一个彻底的例子

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

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

你似乎认为该页面试图让你相信合同是“必要的”。我看不出来。我看到它解释了如何处理合同——如果你认为收益超过成本。如果你从不相信,那很好

值得一提的是,我已经阅读了大量的敲诈勒索代码,而且我很少看到如此复杂的合同。此外,敲诈勒索者很清楚合同有运行成本;通常人们只在重要的“边界”使用它们


最后,如果您喜欢静态类型,您可能更喜欢类型化的Racket。请注意,您可以混合动态和静态类型的球拍模块。为了确保静态类型不变量,边界由。。。合同。

这类合同本质上是“为保护代码添加更多代码”的两难选择,但如何保证您添加的代码没有bug?这类合同本质上是“为保护代码添加更多代码”的两难选择,但如何保证您添加的代码没有bug?这并不能真正解释这一点。这是一本入门指南,不是深入的书。此外,该函数是一个现有函数,被视为一个实际示例。我相信,如果这个例子不是以务实的方式构建的,很多人会发现合同是不必要的。也许你心目中有一个更好的例子?如果您能对文档做出贡献,那就太好了!这并不能真正解释它。这是一本入门指南,不是深入的书。此外,该函数是一个现有函数,被视为一个实际示例。我相信,如果这个例子不是以务实的方式构建的,很多人会发现合同是不必要的。也许你心目中有一个更好的例子?如果您能对文档做出贡献,那就太好了!