为什么Safe Haskell不支持Template Haskell?

use*_*558 17 haskell template-haskell

Safe Haskell的文档说明:

[...]不幸的是,模板Haskell可用于破坏模块边界,因此可用于获取对此构造函数的访问权限.[...]使用-XSafe标志编译Danger模块会限制可用于安全子集的Haskell功能.这包括禁止不安全的PerfromIO,模板Haskell,[...]

用作将AST转换为另一个AST的宏系统,是否不能简单地将TH限制为Haskell的安全子集,并将结果AST限制为该子集?

ham*_*mar 17

在您链接的页面上更下方:

TemplateHaskell - 特别危险,因为即使在编译时它也可能导致副作用,并且可用于访问抽象数据类型.用TH打破模块边界非常容易.

关于副作用的问题来自于TH允许您IO在编译时使用运行任意计算的事实runIO.这会给窗外带来任何安全希望.

打破模块边界意味着使用TH可以访问数据构造函数,即使模块没有导出它们也是如此.

有关在Safe Haskell中允许不安全的事物的许多示例,请参阅此存储库,包括打破模块边界的示例.

如果禁用这些功能,可能会使Template Haskell安全,但是需要对TH进行重大更改.

  • 好的,所以[`runIO`]是罪魁祸首.我想没有它可能会有一个TH? (2认同)