Safe Haskell州的文档:
[...]不幸的是,模板Haskell可用于破坏模块边界,因此可用于获取对此构造函数的访问权限。 [...]使用-XSafe标志编译Danger模块会限制可用于安全子集的Haskell功能。这包括禁止使用unsafePerfromIO,模板Haskell,[...]
用作将AST转换为另一个AST的宏系统,是否不能简单地将TH限制为Haskell的安全子集,并将结果AST限制为该子集?
答案 0 :(得分:17)
在您关联的页面上稍微向下:
TemplateHaskell - 特别危险,因为它甚至可以在编译时引起副作用,并且可以用于访问抽象数据类型。用TH打破模块边界非常容易。
关于副作用的担忧来自TH允许您使用runIO
在编译时运行任意IO
计算的事实。这样可以在窗外抛出任何安全希望。
打破模块边界意味着使用TH可以访问数据构造函数,即使模块没有导出它们。
有关在Safe Haskell中允许不安全的事情的许多示例,请参阅this repository,包括breaking module boundaries的示例。
如果禁用这些功能,可能会使Template Haskell变得安全,但是需要对TH进行重大更改。