【问题标题】:Figuring out chain of implicit invocations找出隐式调用链
【发布时间】:2016-01-20 23:20:56
【问题描述】:

有什么办法可以找出整个隐式链(我对所有隐式类型都感兴趣)。我正在使用 IntelliJ Idea,但我正在寻找任何方法来做到这一点,即使我必须使用另一个 IDE。 (我想知道 REPL 是否可以帮助我)

例如,我写a gt b,其中gt 来自scalaz。我想知道:

  1. 究竟使用了Order 的隐式实例
  2. 使用了什么类型类(我知道在这个特定实例中的答案 - 在 scalaz 中很容易,但通常有时并不总是那么明显)
  3. 整个链a如何接收到方法gt。对于这个特定示例,我知道使用了 ToOrderOps 特征,但总的来说我可能不知道,我也无法弄清楚 ToOrderOps 是如何导入的。

【问题讨论】:

标签: scala


【解决方案1】:

在 REPL 中使用 Scala 反射 API 通常是开始此类调查的好方法:

scala> import scala.reflect.runtime.universe.reify
import scala.reflect.runtime.universe.reify

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> println(reify(1 gt 2))
Expr[Boolean](Scalaz.ToOrderOps(1)(Scalaz.intInstance).gt(2))

scala> println(reify("a" gt "b"))
Expr[Boolean](Scalaz.ToOrderOps("a")(Scalaz.stringInstance).gt("b"))

这里的ToOrderOps 是一种方法,而不是特征,而Scalaz 表示您正在看到它,因为scalaz.Scalaz 混合了ToOrderOps 特征,所以我认为这种方法可以解决您的所有三个问题点。

【讨论】:

  • 我只是想提一下你有多棒。谢谢! :)
猜你喜欢
  • 2017-02-06
  • 2017-05-16
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多