Почему Safe Haskell не поддерживает шаблон Haskell?

В документации для Safe Haskell указано:

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

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

Ответ 1

Немного дальше на странице, которую вы указали:

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

Очень легко сломать границы модулей с помощью TH.

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

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

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

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