为什么不安全的Haskell支持模板Haskell?

Safe Haskell的文档声明:

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

作为一个将AST转换为另一个AST的宏系统,难道不可能简单地将TH限制在Haskell的安全子集中​​,并且还要将产生的AST限制到这个子集?


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

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

对于副作用的担忧来自TH允许您在编译时使用runIO运行任意IO计算的runIO 。 这会给窗外安全带来任何希望。

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

查看这个存储库中的许多安全Haskell不安全的例子,包括打破模块边界的例子。

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

链接地址: http://www.djcxy.com/p/33175.html

上一篇: Why doesn't Safe Haskell support Template Haskell?

下一篇: Why is GHC emitting incorrect "redundant constraint" warning here?