Ho this class a Scala:Perché l'inferenza di tipo Scala fallisce qui?
object Util {
class Tapper[A](tapMe: A) {
def tap(f: A => Unit): A = {
f(tapMe)
tapMe
}
def tap(fs: (A => Unit)*): A = {
fs.foreach(_(tapMe))
tapMe
}
}
implicit def tapper[A](toTap: A): Tapper[A] = new Tapper(toTap)
}
Ora,
"aaa".tap(_.trim)
non si compila, dando l'errore
error: missing parameter type for expanded function ((x$1) => x$1.trim)
Perché il tipo non viene dedotto come String
? Dall'errore sembra che la conversione implicita funzioni (altrimenti l'errore sarebbe lungo le linee di "tap
non è un membro della classe String
"). E sembra che la conversione deve essere a Tapper[String]
, il che significa che il tipo dell'argomento è String => Unit
(o (String => Unit)*
).
La cosa interessante è che se io commento sia di tap
definizioni, allora si compila.
Ottima idea, grazie! Pensavo che avrei dovuto nominarli diversamente. –
Stai rapidamente diventando il nuovo Daniel, Jason! –
@oxbow Ancora meglio, cita spesso le specifiche, che è una buona cosa. –