Ecco un semplice riproduttore, in cui definisco un tipo di coppia "commutativa" che viene fornito con una conversione di riordino implicita. La conversione implicita viene applicata dal compilatore come previsto se l'argomento della funzione f
si trova in un valore denominato preesistente (t
nell'esempio). Tuttavia, se provo a chiamare f
direttamente sul letterale CommutativePair
, non riesce con un errore di tipo. In questo caso il compilatore non applica la conversione di riordino implicita.La conversione implicita di Scala si applica in alcune condizioni ma non in altre
object repro {
import scala.language.implicitConversions
case class CommutativePair[A, B](a: A, b: B)
object CommutativePair {
// Support a kind of commutative behavior via an implicit reordering
implicit def reorderPair[B, A](pair: CommutativePair[B, A]) =
CommutativePair(pair.b, pair.a)
}
// The idea is to allow a call to 'f' with Pair[Int, String] as well,
// via implicit reorder.
def f(p: CommutativePair[String, Int]) = p.toString
val t = CommutativePair(3, "c")
// This works: the implicit reordering is applied
val r1 = f(t)
// This fails to compile: the implicit reordering is ignored by the compiler
val r2 = f(CommutativePair(3, "c"))
}
L'inferenza del tipo sembra fallire; quando aggiungi [Int, String] a CommutativePair ricompila. –
@LodewijkBogaards, d'accordo, sto considerando di segnalarlo come un bug del compilatore di scala, ma in attesa di vedere che tipo di risposte ottengo. – eje
Dovresti. Ho eseguito il codice in 2.11.7 e ho avuto lo stesso problema. Anche se posso immaginare che il compilatore abbia problemi con questo, dovrebbe funzionare. –