История изменений
Исправление monk, (текущая версия) :
Так они в рантайме проверяются контрактами. Статически мы их где вообще возьмем эти данные?
Статически нам придётся их проверить чтобы получить данные нужного типа. А контракт можно забыть.
Вот есть
f :: DigitString -> SQL
g :: DigitString -> ....
g x y = ... f x ...
checkStringIsDigit :: String -> Maybe DigitString
И никак строку в f или g не передать, не проверив. А с контрактами появляется сильное желание поставить контракт только на вход g (ведь f больше ниоткуда не вызывается, зачем повторно проверку делать?). А потом через полгода кто-то делает вызов f, не проверив строку контрактом…
И даже с проверкой контрактом: в GLib всё проверяет контрактами и программы массово пишут в stderr что-то вроде: https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1264364
А пользователи потом пишут программы, чтобы эти сообщения не видеть.
Исходная версия monk, :
Так они в рантайме проверяются контрактами. Статически мы их где вообще возьмем эти данные?
Статически нам придётся их проверить чтобы получить данные нужного типа. А контракт можно забыть.
Вот есть
f :: DigitString -> SQL
g :: DigitString -> ....
g x y = ... f x ...
checkStringIsDigit :: String -> Maybe DigitString
И никак строку в f или g не передать, не проверив. А с контрактами появляется сильное желание поставить контракт только на вход g (ведь f больше ниоткуда не вызывается, зачем повторно проверку делать?). А потом через полгода кто-то делает вызов f, не проверив строку контрактом…
И даже с проверкой контрактом: в GLib всё проверяет контрактами и программы массово пишут в stderr что-то вроде: https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1264364
А пользователи потом [пишут программы](https://github.com/m2osw/advgetopt/blob/master/tools/hide-warnings.cpp], чтобы эти сообщения не видеть.