17

Safe Haskell的文档指出:

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

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

4

1 回答 1

17

在您链接的页面上再往下一点:

TemplateHaskell - 特别危险,因为它甚至在编译时也会产生副作用,并且可用于访问抽象数据类型。使用 TH 很容易打破模块边界。

对副作用的担忧来自于 TH 允许您IO在编译时使用runIO. 这将把任何安全的希望扔到窗外。

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

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

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

于 2011-08-18T13:04:16.180 回答