找出隐式调用链

Arc*_*heg 6 scala

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

例如,我写的是来自a gt b哪里.我想知道:gtscalaz

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

Tra*_*own 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"))
Run Code Online (Sandbox Code Playgroud)

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

  • 我只是想提一下你有多棒.谢谢!:) (9认同)