发现更多类型类实例

Discovering more typeclass instances

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

受此启发,很久以后我注意到了 reifyInstances。虽然我对模板 Haskell 知之甚少,但似乎我们可以发现比平常更多的实例 :info 使用这个技巧可以提供:

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

TH 是否有意 "relaxed" 访问环境? reifyInstances 的正确用法是什么?它与其他形式有何不同?

it seems that that we can discover more instances than usual :info can provide

:info 是有选择性的。来自 documentation:

To avoid showing irrelevant information, an instance is shown only if (a) its head mentions name, and (b) all the other things mentioned in the instance are in scope (either qualified or otherwise) as a result of a :load or :module commands.

The command :info! works in a similar fashion but it removes restriction (b), showing all instances that are in scope and mention name in their head.

因此,默认情况下它只显示已经在范围内的类型的实例,但如果您愿意,它也可以显示其他实例(通过使用 :info! 而不是 :info)。


Does TH intentionally have "relaxed" access to the environment? What is the proper usage of reifyInstances and how it's different from the other form?

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

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