Ich bin zu Fuß durch die Schlägerführung und beenden gerade diese Seite:Was ist der Zweck der verschachtelten Racket Vertrag?
https://docs.racket-lang.org/guide/contracts-first.html
und der daraus resultierende Vertrag ist so verworren, dass ich meine Augen nicht glauben konnte:
(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))]))))]))
ich diese Wette Der Vertrag hat eine viel höhere Komplexität erreicht als die erforderliche tatsächliche Implementierung, obwohl dieser Vertrag keine Implementierungsdetails enthält. Was mich mehr verblüfft, ist, dass der Vertrag nicht einmal eine Kompilierzeitkomponente ist, wie ein Proof of Properties über das Typsystem von Curry-Howard-Isomorphie, so ist es in keiner Hinsicht zertifizierter Programmieransatz und kommt definitiv mit einem Laufzeiteffekt. Mit diesem Grad an Komplexität sehe ich keinen Vorteil darin, einen Vertrag mehr zu machen als, sagen wir, eine einfache Überprüfung des Datentyps, was ich vernünftiger finde.
Könnten Sie darauf hinweisen, wo ich über die Notwendigkeit einer solchen Art von Vertrag fehle r
diese Art von Verträgen ist im Wesentlichen das Dilemma "Hinzufügen von mehr Code zu schützen Code", aber wie garantieren Sie, dass der Code, den Sie hinzugefügt haben, ist fehlerfrei? – HuStmpHrrr