为什么Safe Haskell不支持Template Haskell?

17
Safe Haskell 的文档说明:

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

作为将 AST 转换为另一个 AST 的宏系统,不应该可以将 TH 简单地限制为 Haskell 安全子集,并将结果 AST 限制为此子集吗?
1个回答

17
在您提供的页面上,稍往下看到以下内容:
TemplateHaskell——特别危险,因为它甚至可以在编译时引起副作用,并且可以用于访问抽象数据类型。使用TH非常容易打破模块边界。
对副作用的关注来自于TH允许您使用runIO在编译时运行任意IO计算。这将使任何安全性保障都荡然无存。
打破模块边界意味着使用TH,您可以访问数据构造函数,即使模块没有导出它们也一样。
请参见此存储库以获取许多在Safe Haskell中不安全的事例,包括打破模块边界的示例。
如果禁用这些功能,则可能使Template Haskell变得安全,但是这将需要对TH进行重大更改。

2
好的,所以[runIO]是罪魁祸首。我猜可能会有没有它的TH? - user239558
1
即使没有 runIO,你也可以使用 TH 访问本应无法访问的内容。(也就是说,你可以访问私有函数,这些函数未被导出并且不应该被访问。)那样会破坏 Safe Haskell 的初衷。如果要使用 TH,则必须找出如何防止未经授权的访问。 - MathematicalOrchid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接