2017-06-27 3 views
0

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

+0

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

Antwort

1

Dies ist die Dokumentation?; Ziel der Dokumentation ist es, möglichst viele der Merkmale des Vertragssystems abzudecken.

Angenommen, ich backe Hochzeitstorten. Ich möchte dir zeigen, welche Dinge du auf deiner Hochzeitstorte haben kannst, also mache ich einen Kuchen mit allen möglichen Dekorationen, die du machen kannst, und lege ihn auf eine einfache Basis - vielleicht sogar ein Stück Pappe. Würdest du dir diesen Kuchen ansehen und sich beschweren, dass er zu grell ist? Nein. Der Punkt ist, dass dies ein Menü von Funktionen ist; Nachdem Sie diese Dokumentation gelesen haben, sollten Sie in der Lage sein zu verstehen, was all die verschiedenen Stücke tun.

+0

Das erklärt es nicht wirklich. Es ist ein Leitfaden, nicht ein Buch in der Tiefe. Auch diese Funktion ist ein existierendes, um wie ein reales Beispiel zu dienen. Ich bin mir sicher, dass viele Leute keinen Vertrag finden werden, wenn das Beispiel nicht pragmatisch aufgebaut ist. – HuStmpHrrr

+0

Vielleicht haben Sie ein besseres Beispiel?Es wäre schön, wenn Sie zur Dokumentation beitragen könnten! –

1

Die Seite, auf welche verlinken Sie beginnt:

7,4 Verträge: Ein gründliches Beispiel

Dieser Abschnitt mehr verschiedene Aromen von Verträgen für einen und das gleiche Beispiel entwickelt: Racket des argmax Funktion.

Der letzte Geschmack ist der gründlichste ("Convolut").

Sie scheinen zu denken, dass die Seite versucht, Sie davon zu überzeugen, dass Verträge eine "Notwendigkeit" sind. Ich sehe das nicht. Ich sehe es erklären, was ist möglich mit Verträgen zu tun - wenn/wie/wenn Sie denken, dass die Vorteile die Kosten übersteigen. Wenn Sie das nie glauben, ist das in Ordnung.

Für was es wert ist, habe ich eine Menge Racket Code gelesen, und ich habe selten einen so komplizierten Vertrag gesehen. Racketeers sind sich auch bewusst, dass Verträge Laufzeitkosten haben. oft benutzen sie sie nur an wichtigen "Grenzen".

Wenn Sie statische Typen bevorzugen, bevorzugen Sie Tipped Racket. Beachten Sie, dass Sie dynamisch und statisch getippte Racket-Module mischen können. Um die statischen Invarianten zu gewährleisten, wird die Grenze durch ... Kontrakte geschützt.