Почему Safe Haskell не поддерживает шаблон Haskell? - PullRequest
17 голосов
/ 18 августа 2011

Документация для Safe Haskell гласит:

[...] К сожалению, шаблон Haskell может использоваться для подрыва границ модуля и поэтому может использоваться для получения доступа к этому конструктору.,[...] Использование флага -XSafe для компиляции модуля Danger ограничивает возможности Haskell, которые можно использовать для безопасного подмножества.Это включает запрещение unsafePerfromIO, Template Haskell, [...]

Используется как система макросов, которая переводит AST в другой AST, если невозможно просто ограничить TH безопасным подмножеством Haskell, а также ограничить результирующий AST этим подмножеством?

1 Ответ

17 голосов
/ 18 августа 2011

Чуть ниже на странице, на которую вы ссылались:

TemplateHaskell - особенно опасен, так как может вызывать побочные эффекты даже во время компиляции и может использоваться для доступа к абстрактным типам данных. С помощью TH очень легко нарушить границы модуля.

Беспокойство по поводу побочных эффектов связано с тем, что TH позволяет запускать произвольные IO вычисления во время компиляции с использованием runIO. Это бросило бы любую надежду на безопасность прямо в окно.

Нарушение границ модуля означает, что с помощью TH вы можете, например, получить доступ к конструкторам данных, даже если модуль не экспортировал их.

См. в этом хранилище , где приведено множество примеров того, что было бы небезопасно в Safe Haskell, включая пример нарушения границ модуля .

Возможно, что Template Haskell станет безопасным, если эти функции будут отключены, однако это потребует значительных изменений в TH.

...