2016-01-20 12 views
5

Gibt es eine Möglichkeit, wie kann ich die gesamte implizite Kette (und ich interessiere mich für alle impliziten Arten). Ich benutze IntelliJ Idea, aber ich suche nach einer Möglichkeit, das zu tun, selbst wenn ich mit einer anderen IDE arbeiten muss. (und ich frage mich, ob REPL kann mir dabei helfen)Herausfinden Kette von impliziten Aufrufen

Zum Beispiel schreibe ich a gt b wo gt kommt von scalaz. Und ich möchte wissen:

  1. Genau das, was implizite Instanz von Order verwendet wurde
  2. Was typeclass verwendet wurde (ich kenne die Antwort in diesem speziellen Fall - es ist einfach in scalaz, aber im Allgemeinen manchmal ist es nicht immer, dass offensichtlich)
  3. Ganze Kette wie a erhielt eine Methode gt. Für dieses spezielle Beispiel weiß ich, dass ToOrderOps Merkmal verwendet wurde, aber im Allgemeinen kann ich das nicht wissen, und ich kann auch nicht herausfinden, wie ToOrderOps importiert wurde.
+0

Mit Blick auf @ Eintopf vorherige [Antwort] (http://stackoverflow.com/a/34735993/409976), vielleicht möchten Sie [reparieren] (https://gist.github.com/kevinmeredith/396cea7839fababa7e2a)? –

Antwort

18

die API in der REPL Scala Reflexion Verwendung ist in der Regel eine gute Möglichkeit, diese Art von Untersuchung zu starten:

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")) 

Die ToOrderOps hier ist eine Methode, nicht das Merkmal und die Scalaz zeigt an, dass Sie Ich sehe es, weil scalaz.Scalaz in der Eigenschaft ToOrderOps mischt, also denke ich, dass dieser Ansatz alle drei Ihrer Punkte anspricht.

+8

Ich wollte nur erwähnen, wie großartig du bist. Vielen Dank! :) – Archeg