发现更多类型类实例

时间:2018-08-23 20:24:17

标签: haskell template-haskell

当我刚接触Haskell时,我很难找到各种类型的实例。

出于这个原因,很久以后我注意到reifyInstances。尽管我对模板Haskell知之甚少,但看来使用此技巧我们可以发现比平常:info可以提供的实例更多的实例:

putStrLn $(stringE . pprint =<< reify ''Functor)

TH是否故意“放松”了对环境的访问? reifyInstances的正确用法是什么?与其他形式有何不同?

1 个答案:

答案 0 :(得分:4)

  

似乎我们可以发现比平常:info可以提供的实例更多的实例

:info在设计上是选择性的。来自documentation

  

为避免显示不相关的信息,仅在以下情况下显示一个实例:(a)它的标题提到 name ,并且(b)该实例中提到的所有其他内容都在范围内(合格或其他) )作为:load:module命令的结果。

     

命令:info!的工作方式类似,但是它消除了限制(b),显示了范围内的所有实例,并在其头部提到了 name

因此,默认情况下,它仅显示作用域内的类型的实例,但是如果您愿意,也可以显示其他实例(使用:info!而不是:info)。


  

TH是否故意“放松”了对环境的访问? reifyInstances的正确用法是什么?与其他形式有何不同?

据我所知,TH可以访问编译器可以访问的代码中的所有内容,否则它在扩展语言方面不会那么有效。

reifyInstances的正确用法确实是在扩展语言中。 “其他形式”(我假设您指的是:info)是为了便于在GHCi中进行交互使用。另一方面,TH软件包用于编写元编程库。例如,假设您正在编写一个库以自动生成任意类型的实例。也许您希望您的库在一般情况下生成通用代码,但是如果数据类型已经实现某些类型类,则可以自动生成特殊的“性能”代码。 reifyInstances在这里可能会有用。