为什么不安全的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?