【问题标题】:Why doesn't Safe Haskell support Template Haskell?为什么 Safe Haskell 不支持 Template Haskell?
【发布时间】:2011-08-18 12:21:06
【问题描述】:

Safe Haskell 的文档指出:

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

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

【问题讨论】:

    标签: haskell template-haskell


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 好的,所以 [runIO] 是罪魁祸首。我想没有它可能会有一个 TH?
    • 即使没有runIO,您也可以使用 TH 访问不应该访问的内容。 (即,您可以访问未导出且不应访问的私有函数。)这违背了 Safe Haskell 的全部意义。要使用 TH,您必须弄清楚如何防止未经授权的访问。
    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 2021-07-16
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多