LINUX.ORG.RU

История изменений

Исправление 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], чтобы эти сообщения не видеть.