在模板Haskell中,Q
monad是所有魔法发生的地方。但是,Q
的API非常有限。我希望有一个valueNameStore :: Q (String -> Maybe Name)
类型的值,它基本上捕获了lookupValueName :: String -> Q (Maybe Name)
的功能,但是当它被绑定时存储了变量。
我认为这在理论上是合理的:如果我在共享常量状态执行它们时我不应该对我的查找进行排序,这是我最初调用bind时Q
状态的快照valueNameStore
。
如果不可能,是否有任何方法以不安全的方式强制通过?我愿意将自己降低到涉及unsafePerformIO
...
答案 0 :(得分:0)
答案基本上没有。如果你能以某种方式枚举范围中的名称,可能会有一些不合理的方法。虽然你是正确的,你建议的类型和语义的操作是完全合理的,但这并不意味着它(合理地)可以从提供的接口实现,即使使用unsafePerformIO
。
基本上,从字符串到Name
的映射是可变的。你想做什么需要拍摄那个可变字典的快照。 API不提供此类功能,据我所知,它也没有为您提供手动复制数据的工具。尝试使用unsafePerformIO
只会导致您在计算表达式时得到映射中的任何绑定,如果您更改了范围,则会与调用{{1}时的绑定不同行动。