Как вы можете прочитать в Руководстве пользователя GHC , если вы пометите свои модули Safe
, вы ограничены определенным "безопасным" подмножеством языка Haskell.
- Вы можете импортировать только модули, которые также помечены
Safe
(что исключает такие функции, как unsafeCoerce
или unsafePerformIO
). - Вы не можете использовать Template Haskell.
- YouВы не можете использовать FFI вне
IO
. - Вы не можете использовать
GeneralisedNewtypeDeriving
. - Вы не можете вручную реализовать класс типов
Generic
для типов, определенных в вашеммодуль. - и т. д.
В обмен на это пользователи модуля получают кучу гарантий (цитируя руководство):
- Ссылочная прозрачность - типам можно доверять.Любая чистая функция гарантированно будет чистой.Оценка их является детерминированной и не вызовет никаких побочных эффектов.Функции в монаде
IO
все еще разрешены и ведут себя как обычно.Так, например, функция unsafePerformIO ::
IO a -> a
запрещена на безопасном языке для принудительного применения этого свойства. - Контроль границ модуля - на безопасном языке доступны только те символы, которые доступны через списки экспорта других модулей.Значения, использующие конструкторы данных, не экспортируемые определяющим модулем, не могут быть проверены или созданы.Таким образом, если модуль
M
устанавливает некоторые инварианты посредством тщательного использования своего списка экспорта, то код, написанный на безопасном языке, который импортирует M
, гарантирует соблюдение этих инвариантов. - Семантическая согласованность - для любогомодуль, который импортирует модуль, написанный на безопасном языке, выражения, которые компилируются как с безопасным импортом, так и без него, имеют одинаковое значение в обоих случаях.То есть импорт модуля, написанного на безопасном языке, не может изменить значение существующего кода, который не зависит от этого модуля.Так, например, существуют некоторые ограничения на использование
OverlappingInstances
, так как они могут нарушать это свойство. - Строгое подмножество - безопасный язык является строго подмножеством Haskell, как реализовано GHC.Любое выражение, которое компилируется на безопасном языке, имеет то же значение, что и при компиляции в обычном Haskell.
Обратите внимание, что безопасность подразумевается.Если ваш модуль не помечен ни одним из Safe
, Trustworthy
или Unsafe
, GHC выведет безопасность модуля на Safe
или Unsafe
.Когда вы устанавливаете флаг Safe
, GHC выдаст ошибку, если решит, что модуль на самом деле не безопасен.Вы также можете установить -Wunsafe
, который выдает предупреждение, если модуль считается небезопасным.Если вы позволите сделать вывод, ваш модуль продолжит компиляцию, даже если статус безопасности ваших зависимостей изменится.Если вы его напишите, вы пообещаете своим пользователям, что статус безопасности стабильный и надежный.
Один из описанных в руководстве вариантов использования относится к запуску «ненадежного» кода.Если вы предоставляете какие-либо точки расширения в своем продукте и хотите убедиться, что эти возможности не используются для атаки на ваш продукт, вы можете потребовать, чтобы код для точек расширения был помечен как Safe
.
* 1056.* Вы можете пометить свой модуль
Trustworthy
, и это никак не ограничивает вас при реализации вашего модуля.Тогда ваш модуль может быть использован из кода
Safe
, и вы несете ответственность за нарушение гарантий, которые должны быть заданы кодом
Safe
.Так что это обещание, вы, автор указанного модуля, дайте.Вы можете использовать флаг
-fpackage-trust
, чтобы включить дополнительные проверки при компиляции модулей, помеченных как
Trustworthy
, описанных
здесь .
Итак, если вы пишете обычные библиотеки и у вас нет веской причины заботиться о Safe Haskell, то вам, вероятно, это не нужно.Если ваши модули безопасны, это нормально и может быть выведено.Если нет, то это, вероятно, по какой-то причине, например, потому что вы использовали unsafePerformIO
, что тоже хорошо.Если вы знаете, что ваш модуль будет использоваться таким образом, который требует его компиляции в -XSafe
(например, плагины, как указано выше), вы должны это сделать.Во всех остальных случаях не беспокойтесь.