2016-01-20 12 views
5

Esiste un modo per capire l'intera catena implicita (e sono interessato a tutti i tipi impliciti). Sto usando IntelliJ Idea, ma sto cercando un modo per farlo, anche se devo lavorare con un altro IDE. (e mi chiedo se REPL può aiutarmi con questo)Calcolo della catena di invocazioni implicite

Ad esempio, scrivo a gt b dove gt viene da scalaz. E voglio sapere:

  1. Esattamente quello che è stato utilizzato istanza implicita di Order
  2. Cosa typeclass è stato utilizzato (So che la risposta in questo caso particolare - è facile in scalaz, ma in generale a volte non sempre che ovvio)
  3. Tutta la catena come a ha ricevuto un metodo gt. Per questo particolare esempio, so che è stato utilizzato il tratto ToOrderOps, ma in generale potrei non saperlo e inoltre non riesco a capire come è stato importato ToOrderOps.
+0

Guardando la precedente [risposta] di @ stew (http://stackoverflow.com/a/34735993/409976), forse si desidera [reificare] (https://gist.github.com/kevinmeredith/396cea7839fababa7e2a)? –

risposta

18

Utilizzando la riflessione API Scala nel REPL di solito è un buon modo per iniziare questo tipo di indagine:

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

Il ToOrderOps ecco un metodo, non il tratto, e la Scalaz indica che si Lo vediamo perché i mix scalaz.Scalaz si mescolano nel tratto ToOrderOps, quindi penso che questo approccio risolva tutti e tre i tuoi punti.

+8

Volevo solo dire quanto sei fantastico. Grazie! :) – Archeg