¿Por qué Safe Haskell no soporta Template Haskell?
template-haskell (1)
La documentación para Safe Haskell dice:
[...] Desafortunadamente, la plantilla Haskell se puede usar para subvertir los límites de los módulos y, por lo tanto, se podría usar para obtener acceso a este constructor. [...] El uso del indicador -XSafe para compilar el módulo Danger restringe las características de Haskell que se pueden usar para un subconjunto seguro. Esto incluye rechazar unsafePerfromIO, Template Haskell, [...]
Utilizado como un sistema macro que traduce un AST a otro AST, ¿no debería ser posible simplemente restringir TH al subconjunto seguro de Haskell, y también restringir el AST resultante a este subconjunto?
Un poco más abajo en la página que has enlazado:
TemplateHaskell: es particularmente peligroso, ya que puede causar efectos secundarios incluso en el momento de la compilación y puede usarse para acceder a tipos de datos abstractos. Es muy fácil romper los límites del módulo con TH.
La preocupación acerca de los efectos secundarios proviene del hecho de que TH le permite ejecutar cálculos arbitrarios de IO
en el momento de la compilación utilizando runIO
. Esto arrojaría cualquier esperanza de seguridad por la ventana.
Romper los límites de los módulos significa que al usar TH se puede acceder, por ejemplo, a constructores de datos, aunque un módulo no los haya exportado.
Consulte este repositorio para ver muchos ejemplos de cosas que no sería seguro permitir en Safe Haskell, incluido un ejemplo de romper los límites de los módulos .
Es posible que la plantilla Haskell se pueda proteger si estas funciones estuvieran deshabilitadas, sin embargo, requeriría cambios significativos en la TH.