【问题标题】:Extract value environment from Q monad从 Q monad 中提取值环境
【发布时间】:2017-08-15 08:39:01
【问题描述】:

在 Template Haskell 中,Q monad 是所有魔法发生的地方。但是,Q 的 API 非常有限。我想要一个valueNameStore :: Q (String -> Maybe Name) 类型的值,它基本上捕获了lookupValueName :: String -> Q (Maybe Name) 的功能,但在绑定时存储了可用的变量。

我认为这在理论上是合理的:如果我在针对共享常量状态执行查找时,我不需要对查找进行排序,该状态是我最初在 @987654327 上调用 bind 时 Q 状态的快照@。


如果这不可能,有没有办法以不安全的方式强制它通过?我愿意将自己降低到任何涉及unsafePerformIO...

【问题讨论】:

    标签: haskell ghc template-haskell


    【解决方案1】:

    答案基本上是否定的。如果您可以以某种方式枚举范围内的名称,则可能有一些不合理的方法可以做到这一点。虽然您认为具有您建议的类型和语义的操作是完全明智的,但这并不意味着即使使用unsafePerformIO,它也可以(合理地)从提供的接口实现。

    基本上,从字符串到Names 的映射是可变的。您想要做的事情需要对该可变字典进行快照。 API 没有提供这样的功能,据我所知,它也没有为您提供手动复制数据的工具。尝试使用unsafePerformIO 只会导致您在评估表达式时获取映射中的任何绑定,如果您更改了范围,则与调用Q 操作时的绑定不同。

    【讨论】:

    • 如果我愿意在评估表达式时获得映射中的任何映射怎么办?我看不出unsafePerformIO 会有什么帮助。是的,快照的想法是我的想法,但是......很多东西都在范围内。即使只是前奏......
    • 再一次,unsafePerformIO 在这里没有帮助。 lookupValueName 存在于 Q monad 中,大多数操作(即所有查找操作)都无法逃脱 Q monad。
    • 无意冒犯,但您是否还在尝试您所建议的事情? Quasidoesn't permit any lookupsIO 实例。 runQ 无济于事 - 你实际上无法(AFAIK)逃脱 Q
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2012-03-31
    • 2021-08-18
    • 2014-02-10
    相关资源
    最近更新 更多