Em um nível prático, contratos são afirmações. Eles permitem verificar propriedades (sem quantificadores) de execuções individuais de um programa. A idéia principal no coração da verificação do contrato é a idéia da culpa - basicamente, você quer saber quem é o culpado por uma violação do contrato. Pode ser uma implementação (que não calcula o valor prometido) ou o chamador (que passou uma função com o tipo errado de valor).
O principal insight é que você pode rastrear a culpa usando o mesmo mecanismo que os pares de incorporação-projeção na construção de limites inversos da teoria de domínio. Basicamente, você muda de trabalhar com asserções para trabalhar com pares de asserções, uma das quais culpa o contexto do programa e a outra culpa do programa. Isso permite agrupar funções de ordem superior com contratos, porque é possível modelar a contravariância do espaço de função trocando o par de asserções. (Veja o artigo de Nick Benton "Desfazendo a digitação dinâmica" , por exemplo.)
Tipos dependentes são tipos. Os tipos especificam regras para afirmar se determinados programas são aceitáveis ou não. Como resultado, eles não incluem coisas como a noção de culpa, pois sua função é impedir que programas mal comportados existam em primeiro lugar. Não há nada para culpar, uma vez que apenas programas bem formados são até expressões gramaticais. Pragmaticamente, isso significa que é muito fácil usar tipos dependentes para falar de propriedades de termos com quantificadores (por exemplo, que uma função funciona para todas as entradas).
Essas duas visões não são as mesmas, mas estão relacionadas. Basicamente, o ponto é que, com contratos, começamos com um domínio universal de valores e usamos contratos para reduzir as coisas. Mas quando usamos tipos, tentamos especificar domínios menores de valores (com uma propriedade desejada) antecipadamente. Assim, podemos conectar os dois por meio de famílias de relações direcionadas ao tipo (ou seja, relações lógicas). Por exemplo, veja a recente "culpa por todos" de Ahmed, Findler, Siek e Wadler , ou "O significado dos tipos de Reynolds : da intrínseca à semântica extrínseca" .