Je this class à Scala:Pourquoi l'inférence de type Scala échoue-t-elle ici?
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)
}
Maintenant,
"aaa".tap(_.trim)
ne compile pas, donnant l'erreur
error: missing parameter type for expanded function ((x$1) => x$1.trim)
Pourquoi pas le type déduit que String
? De l'erreur, il semble que la conversion implicite se déclenche (sinon l'erreur serait sur le modèle de "tap
n'est pas un membre de la classe String
"). Et il semble que la conversion doit être à Tapper[String]
, ce qui signifie que le type de l'argument est String => Unit
(ou (String => Unit)*
).
La chose intéressante est que si je commente soit de tap
définitions, alors il compile.
Excellente idée, merci! Je pensais que je devrais les nommer différemment. –
Vous devenez rapidement le nouveau Daniel, Jason! –
@oxbow Encore mieux, il cite souvent les spécifications, ce qui est une bonne chose. –