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

我认为从理论上讲这是合理的:如果我针对共享常量状态执行查找时,无需对序列进行排序,当我最初在Q上调用bind时,它是valueNameStore状态的快照。



如果无法做到这一点,有没有办法以不安全的方式强迫它通过?我愿意将自己放低到涉及unsafePerformIO的所有黑客...

最佳答案

答案基本上是不。如果您可以通过某种方式枚举作用域中的名称,则可能会有一些不合理的方法来执行此操作。尽管您正确地建议了所建议的具有类型和语义的操作是完全明智的,但这并不意味着即使使用unsafePerformIO也可以从提供的接口中(合理地)实现该操作。

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

关于haskell - 从Q monad提取值(value)环境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42965085/

10-12 03:37