【问题标题】:Discovering more typeclass instances发现更多类型类实例
【发布时间】:2018-08-24 07:12:58
【问题描述】:

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

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

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

TH 是否有意“放松”地进入环境? reifyInstances 的正确用法是什么,它与其他形式有何不同?

【问题讨论】:

  • 你能举一个例子,它比:i提供更多信息吗?例如如果我只是启动ghci -XTemplateHaskell,导入Language.Haskell.TH,然后运行它,我会从putStrLn $(...) 获得6 个实例,从:i 获得7 个实例(由于某种原因,TH 缺少Either a 实例)。

标签: haskell template-haskell


【解决方案1】:

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

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

为避免显示不相关的信息,仅当 (a) 其头部提及 name 且 (b) 实例中提及的所有其他内容都在范围内时(无论是合格的还是其他),才会显示实例) 作为:load:module 命令的结果。

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

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


TH 是否有意“放松”地进入环境? reifyInstances 的正确用法是什么,它与其他形式有什么不同?

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

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

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多