为什么Safe Haskell不支持Template Haskell?

时间:2011-08-18 12:21:06

标签: haskell template-haskell

Safe Haskell州的文档:

  

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

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

1 个答案:

答案 0 :(得分:17)

在您关联的页面上稍微向下:

  

TemplateHaskell - 特别危险,因为它甚至可以在编译时引起副作用,并且可以用于访问抽象数据类型。用TH打破模块边界非常容易。

关于副作用的担忧来自TH允许您使用runIO在编译时运行任意IO计算的事实。这样可以在窗外抛出任何安全希望。

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

有关在Safe Haskell中允许不安全的事情的许多示例,请参阅this repository,包括breaking module boundaries的示例。

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