I have this class in Scala:
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)
}
Now,
"aaa".tap(_.trim)
doesn't compile, giving the error
error: missing parameter type for expanded function ((x$1) => x$1.trim)
Why isn't the type inferred as String
? From the error it seems that the implicit conversion does fire (otherwise the error would be along the lines of "tap
is not a member of class String
"). And it seems the conversion must be to Tapper[String]
, which means the type of the argument is String => Unit
(or (String => Unit)*
).
The interesting thing is that if I comment out either of tap
definitions, then it does compile.