私はラケットガイドを歩くと、ちょうどこのページ仕上がっています:畳んだラケット契約の目的は何ですか?
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 [email protected] (f r))
(define flov (map f lov))
(and (is-first-max? r [email protected] (map list lov flov))
(dominates-all [email protected] flov))]))))]))
私はこれを賭けますこの契約は実際に実装の詳細を明らかにしていませんが、契約は必要な実際の実装よりもずっと複雑になりました。何が私をさらに悩ませているのは、契約がカリー・ハワードの同型性による型システムを介したプロパティの証明のようなコンパイル時のコンポーネントでもないことです。したがって、認定されたプログラミングアプローチではなく、ランタイム効果が欠点です。この複雑さのレベルでは、単純なデータ型チェックというよりも、契約をすることの利点がありません。これについては、私はそれについてもっと知ることができます。 ?
私は契約書のような種類の必要性について、行方不明ですどこが指摘でしたR
この種の契約は基本的に「コードをガードコードに追加する」というジレンマですが、追加したコードにバグがないことをどのように保証しますか? – HuStmpHrrr