Как узнать, когда явно чистый интерфейс Haskell скрывает небезопасные операции?
Я читал о unsafePerformIO
в последнее время, и я хотел бы спросить вас кое-что. Я согласен с тем фактом, что настоящий язык должен иметь возможность взаимодействовать с внешней средой, поэтому unsafePerformIO
несколько оправдано.
Тем не менее, насколько мне известно, я не знаю ни одного быстрого способа узнать, действительно ли чисто (судя по типам) интерфейс / библиотека действительно чист, без проверки кода в поисках вызовов unsafePerformIO
(документация может не упомянуть об этом). Я знаю, что его следует использовать только тогда, когда вы уверены, что ссылочная прозрачность гарантирована, но я все же хотел бы знать об этом.
2 ответа
Нет пути без проверки исходного кода. Но это не так уж сложно, так как Хэддок дает хорошую ссылку прямо на определения, выделенные синтаксисом, прямо в документации. См. Ссылку "Источник" справа от определений на этой странице для примера.
Безопасный Haskell уместен здесь; он используется для компиляции кода на Haskell в ситуациях, когда вы хотите запретить использование небезопасных функций. Если модуль использует небезопасный модуль (например, System.IO.Unsafe
) и не помечен как Trustworthy
Он унаследует свой небезопасный статус. Но модули, которые используют unsafePerformIO
как правило, будет использовать его безопасно, и, таким образом, заявить о себе Trustworthy
,
В том случае, если вы думаете, использование unsafePerformIO
неоправдан. Документация дляunsafePerformIO
объясняет это: он предназначен только для случаев, когда разработчик может доказать, что нет способа нарушить ссылочную прозрачность, то есть "чисто функциональную" семантику. Т.е. если кто-нибудь использует unsafePerformIO
таким образом, что его может обнаружить чисто функциональная программа (например, написать функцию, результат которой зависит не только от ее аргументов), но это недопустимое использование.
Если вы столкнулись с таким случаем, наиболее вероятно, что вы нашли ошибку.