从Q monad中提取值环境

时间:2017-03-23 00:26:35

标签: haskell ghc template-haskell

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

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

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

的任何黑客行为

1 个答案:

答案 0 :(得分:0)

答案基本上没有。如果你能以某种方式枚举范围中的名称,可能会有一些不合理的方法。虽然你是正确的,你建议的类型和语义的操作是完全合理的,但这并不意味着它(合理地)可以从提供的接口实现,即使使用unsafePerformIO

基本上,从字符串到Name的映射是可变的。你想做什么需要拍摄那个可变字典的快照。 API不提供此类功能,据我所知,它也没有为您提供手动复制数据的工具。尝试使用unsafePerformIO只会导致您在计算表达式时得到映射中的任何绑定,如果您更改了范围,则会与调用{{1}时的绑定不同行动。