当我刚接触Haskell时,我很难找到各种类型的实例。
出于这个原因,很久以后我注意到reifyInstances。尽管我对模板Haskell知之甚少,但看来使用此技巧我们可以发现比平常:info
可以提供的实例更多的实例:
putStrLn $(stringE . pprint =<< reify ''Functor)
TH是否故意“放松”了对环境的访问? reifyInstances的正确用法是什么?与其他形式有何不同?
答案 0 :(得分:4)
似乎我们可以发现比平常
:info
可以提供的实例更多的实例
:info
在设计上是选择性的。来自documentation:
为避免显示不相关的信息,仅在以下情况下显示一个实例:(a)它的标题提到 name ,并且(b)该实例中提到的所有其他内容都在范围内(合格或其他) )作为
:load
或:module
命令的结果。命令
:info!
的工作方式类似,但是它消除了限制(b),显示了范围内的所有实例,并在其头部提到了 name 。
因此,默认情况下,它仅显示作用域内的类型的实例,但是如果您愿意,也可以显示其他实例(使用:info!
而不是:info
)。
TH是否故意“放松”了对环境的访问? reifyInstances的正确用法是什么?与其他形式有何不同?
据我所知,TH可以访问编译器可以访问的代码中的所有内容,否则它在扩展语言方面不会那么有效。
reifyInstances
的正确用法确实是在扩展语言中。 “其他形式”(我假设您指的是:info
)是为了便于在GHCi中进行交互使用。另一方面,TH软件包用于编写元编程库。例如,假设您正在编写一个库以自动生成任意类型的实例。也许您希望您的库在一般情况下生成通用代码,但是如果数据类型已经实现某些类型类,则可以自动生成特殊的“性能”代码。 reifyInstances
在这里可能会有用。