Проблема (досить абстрактна), яку атакують і типи, і контракти, - "Як забезпечити, щоб програми мали певні властивості?". Тут існує властива напруженість між тим, щоб мати можливість виразити ширший клас властивостей і бути здатним перевірити, чи має програма властивість чи ні. Системи типів зазвичай забезпечують дуже специфічну властивість (програма ніколи не виходить з ладу певними способами) і мають алгоритм перевірки типу. З іншого боку, контракти дозволяють вказати дуже широкий спектр властивостей (скажімо, вихід цієї програми є простим числом), але не мають алгоритму перевірки.
Тим не менш, факт відсутності алгоритму перевірки контрактів (який завжди працює) не означає, що майже немає алгоритмів перевірки контрактів (які, як правило, працюють на практиці). Я рекомендую вам переглянути Spec # та плагін Jessie від Frama-C . Вони обидва працюють, висловлюючи "ця програма підкоряється цьому договору", як висловлення в логіці першого порядку за допомогою генерації умови перевірки , а потім запитуючи SMTвирішити, спробувати знайти доказ. Якщо розв'язувальник не знайде доказ, то або програма неправильна, або ж, вирішувач не зміг знайти підтвердження, яке існує. (Ось чому це "майже" алгоритм перевірки контрактів.) Існують також інструменти, засновані на символічному виконанні, що означає, що "ця програма підкоряється цьому договору" виражається як купа пропозицій (за деякою логікою). Див., Наприклад, jStar .
Робота Фланагана намагається взяти те, що найкраще з обох світів, так що ви можете швидко перевірити типові властивості, а потім працювати на відпочинок. Я не дуже знайомий з гібридними типами, але я пам’ятаю, як автор говорив, що його мотивація полягала в тому, щоб розробити рішення, яке потребує меншої кількості анотацій (ніж його попередня робота над ESC / Java). У певному сенсі, однак, існує певна інтеграція між типами та контрактами в ESC / Java (і Spec #): під час перевірки контрактів вирішувач повідомляє, що перевірка типу успішна, щоб вона могла отримати цю інформацію.