找出隐式调用链

时间:2016-01-20 15:03:54

标签: scala

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

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

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

1 个答案:

答案 0 :(得分:20)

在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特征,所以我认为这种方法可以解决你的所有三点。