Я думаю, что системы DbC и type несопоставимы.Существует путаница между DbC и системами типов (или даже системами верификации).Например, мы можем найти сравнение инструментов DbC и Liquid Haskell или инфраструктуры DbC и QuickCheck.ИМХО, это не правильно: системы типов, а также системы формальных проверок утверждают только одно - вы: у вас в голове есть несколько алгоритмов, и вы объявляете свойства этих алгоритмов.Затем вы реализуете эти алгоритмы.Системы типов, а также системы формальных проверок подтверждают, что код реализации соответствует заявленным свойствам.
DbC проверяет не внутренние вещи (реализация / код / алгоритм), а внешние вещи: ожидаемые свойства вещей, которые являются внешними дляваш код.Это может быть состояние среды, файловой системы, базы данных, вызывающих абонентов, ваше собственное состояние, что угодно.Типичные контракты работают во время выполнения, а не во время компиляции или в специальной фазе проверки.
Канонический пример DbC показывает, как была обнаружена ошибка в чипе HP.Это происходит потому, что DbC объявляет свойства внешнего компонента: чипа, его состояния, переходов и т. Д. И если ваше приложение сталкивается с неожиданным состоянием внешнего мира, оно сообщает о таком случае как об исключении.Волшебство здесь таково: 1) вы определяете контракты в одном месте и не повторяете себя 2) контракты могут быть легко отключены (исключены из скомпилированного двоичного файла).ИМХО они более близки к аспектам, потому что они не являются «линейными», как вызовы подпрограмм.
Мое резюме здесь заключается в том, что DbC более полезен, чтобы избежать реальных ошибок, чем системы типов, потому что большинство реальных ошибок происходят из-занепонимание поведения внешнего мира / среды / фреймворков / компонентов ОС / и т.д.Типы и помощь в подтверждении помогают только избежать ваших собственных простых ошибок, которые можно обнаружить с помощью тестов или моделирования (в MatLab, Mathematica и т. Д. И т. Д.).
Короче говоря: вы не можете найти ошибку в чипе HP с типамисистема.Конечно, существует иллюзия, что возможно что-то вроде индексированных монад, но реальный код с такими попытками будет выглядеть супер сложным, неподдерживаемым и не практичным.Но я думаю, что возможны некоторые гибридные схемы.