在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/