Verträge sind auf praktischer Ebene Behauptungen. Mit ihnen können Sie die (quantifiziererfreien) Eigenschaften einzelner Programmausführungen überprüfen. Die Schlüsselidee bei der Vertragskontrolle ist die Idee der Schuld - im Grunde wollen Sie wissen, wer für eine Vertragsverletzung verantwortlich ist. Dies kann entweder eine Implementierung sein (die den versprochenen Wert nicht berechnet) oder der Aufrufer (der einer Funktion den falschen Wert übergeben hat).
Die entscheidende Erkenntnis ist, dass Sie die Schuld mit der gleichen Maschinerie verfolgen können wie die Einbettung von Projektionspaaren in die inverse Grenzwertkonstruktion der Domänentheorie. Grundsätzlich wechseln Sie von der Arbeit mit Zusicherungen zur Arbeit mit Paaren von Zusicherungen, von denen eine den Programmkontext und die andere das Programm beschuldigt. Auf diese Weise können Sie Funktionen höherer Ordnung in Kontrakte einschließen, da Sie die Kontravarianz des Funktionsbereichs modellieren können, indem Sie das Assertionspaar austauschen. (Siehe zum Beispiel Nick Bentons Artikel "Undoing Dynamic Typing" .)
Abhängige Typen sind Typen. Typen geben Regeln an, nach denen festgestellt werden kann, ob bestimmte Programme zulässig sind oder nicht. Infolgedessen schließen sie Dinge wie den Begriff der Schuld nicht ein, da ihre Funktion darin besteht, die Existenz von Programmen, die sich schlecht benehmen, an erster Stelle zu verhindern. Es gibt nichts zu bemängeln, da nur wohlgeformte Programme auch grammatikalische Äußerungen sind. Pragmatisch bedeutet dies, dass es sehr einfach ist, abhängige Typen zu verwenden, um über Eigenschaften von Termen mit Quantifizierern zu sprechen (z. B. dass eine Funktion für alle Eingaben funktioniert).
Diese beiden Ansichten sind nicht gleich, aber sie hängen zusammen. Grundsätzlich geht es darum, dass wir bei Verträgen mit einem universellen Wertebereich beginnen und Verträge verwenden, um Dinge zu reduzieren. Wenn wir jedoch Typen verwenden, versuchen wir, kleinere Wertebereiche (mit einer gewünschten Eigenschaft) im Voraus anzugeben. So können wir die beiden über typgesteuerte Beziehungsfamilien (dh logische Beziehungen) verbinden. Siehe zum Beispiel Ahmed, Findler, Siek und Wadlers jüngstes "Blame for All" oder Reynolds "The Meaning of Types: from Intrinsic to Extrinsic Semantics" .