Как узнать, когда явно чистый интерфейс Haskell скрывает небезопасные операции?

Я читал о unsafePerformIO в последнее время, и я хотел бы спросить вас кое-что. Я согласен с тем фактом, что настоящий язык должен иметь возможность взаимодействовать с внешней средой, поэтому unsafePerformIO несколько оправдано.

Тем не менее, насколько мне известно, я не знаю ни одного быстрого способа узнать, действительно ли чисто (судя по типам) интерфейс / библиотека действительно чист, без проверки кода в поисках вызовов unsafePerformIO (документация может не упомянуть об этом). Я знаю, что его следует использовать только тогда, когда вы уверены, что ссылочная прозрачность гарантирована, но я все же хотел бы знать об этом.

2 ответа

Решение

Нет пути без проверки исходного кода. Но это не так уж сложно, так как Хэддок дает хорошую ссылку прямо на определения, выделенные синтаксисом, прямо в документации. См. Ссылку "Источник" справа от определений на этой странице для примера.

Безопасный Haskell уместен здесь; он используется для компиляции кода на Haskell в ситуациях, когда вы хотите запретить использование небезопасных функций. Если модуль использует небезопасный модуль (например, System.IO.Unsafe) и не помечен как TrustworthyОн унаследует свой небезопасный статус. Но модули, которые используют unsafePerformIO как правило, будет использовать его безопасно, и, таким образом, заявить о себе Trustworthy,

В том случае, если вы думаете, использование unsafePerformIO неоправдан. Документация дляunsafePerformIO объясняет это: он предназначен только для случаев, когда разработчик может доказать, что нет способа нарушить ссылочную прозрачность, то есть "чисто функциональную" семантику. Т.е. если кто-нибудь использует unsafePerformIO таким образом, что его может обнаружить чисто функциональная программа (например, написать функцию, результат которой зависит не только от ее аргументов), но это недопустимое использование.

Если вы столкнулись с таким случаем, наиболее вероятно, что вы нашли ошибку.

Другие вопросы по тегам