Я проходил Контракты в Руководстве по сборке для ракеток.
Конструкция ->i
позволяет помещать произвольные ограничения на вход/выход функции.
Например, я мог бы иметь функцию unzip
, которая берет список пар и возвращает два списка. Используя контракты, я мог бы подтвердить, что каждый элемент in-list является парой и что out-lists имеют соответствующие элементы.
В руководстве по ракетке намекает, что это когда контракты полезны. Но похоже, что это было бы лучше сделано внутри самой функции. Я могу выбросить ошибку, если столкнулся с непарой, это проверит список. Вывод автоматически проверяется с помощью правильной функции.
Каков конкретный пример того, где код каким-то образом улучшается по контракту более сложным, чем простые типы?