На практическом уровне контракты являются утверждениями. Они позволяют проверять (без квантификатора) свойства отдельных исполнений программы. Ключевой идеей, лежащей в основе проверки контракта, является идея вины - в основном вы хотите знать, кто виноват в нарушении контракта. Это может быть либо реализация (которая не вычисляет обещанное значение), либо вызывающая сторона (которая передала функции неправильное значение).
Ключевым моментом является то, что вы можете отслеживать вину, используя тот же механизм, что и пары вложение-проекция, в построении теории обратных доменов. По сути, вы переключаетесь с работы с утверждениями на работу с парами утверждений, одно из которых обвиняет контекст программы, а другое - программу. Тогда это позволяет вам обернуть функции высшего порядка в контракты, потому что вы можете смоделировать контравариантность функционального пространства, поменяв местами пару утверждений. (См., Например, статью Ника Бентона «Отмена динамического набора текста» .)
Зависимые типы являются типами. Типы определяют правила для утверждения, являются ли определенные программы приемлемыми или нет. В результате они не включают в себя такие вещи, как понятие вины, поскольку их функция заключается в том, чтобы в первую очередь не допускать плохого поведения программ. В этом нечего винить, так как только правильно оформленные программы являются даже грамматическими высказываниями. Прагматически это означает, что очень легко использовать зависимые типы, чтобы говорить о свойствах терминов с квантификаторами (например, что функция работает для всех входных данных).
Эти два взгляда не совпадают, но они связаны между собой. По сути, дело в том, что с контрактами мы начинаем с универсальной области ценностей и используем контракты, чтобы сократить расходы. Но когда мы используем типы, мы стараемся указывать меньшие домены значений (с желаемым свойством) заранее. Таким образом, мы можем связать их с помощью типо-ориентированных семейств отношений (т. Е. Логических отношений). Например, см. Недавнюю «Вину за все» Ахмеда, Финдлера, Зика и Вадлера или «Значение типов Рейнольдсом : от внутренней до внешней семантики» .