[プログラミング] 暗黙の型変換とか暗黙の引数の確認

一体どの関数が呼ばれているのかわからないことに定評のあるscalaの自動型変換/暗黙の引数だが、コンパイル時に-Xprint:typerオプションを付与することで確認可能である。
implicit.scala

val a = Map("a" -> 1, "b" -> 2)

a.map(_._2)

オプションをつけて実行

$ scala -Xprint:typer implicit.scala
[[syntax trees at end of typer]]// Scala source: implicit.scala
package <empty> {
  final object Main extends java.lang.Object with ScalaObject {
    def this(): object Main = {
      Main.super.this();
      ()
    };
    def main(argv: Array[String]): Unit = {
      val args: Array[String] = argv;
      {
        final class $anon extends scala.AnyRef {
          def this(): anonymous class $anon = {
            $anon.super.this();
            ()
          };
          private[this] val a: scala.collection.immutable.Map[java.lang.String,Int] = scala.this.Predef.Map.apply[java.lang.String, Int](scala.this.Predef.any2ArrowAssoc[java.lang.String]("a").->[Int](1), scala.this.Predef.any2ArrowAssoc[java.lang.String]("b").->[Int](2));
          private <stable> <accessor> def a: scala.collection.immutable.Map[java.lang.String,Int] = $anon.this.a;
          $anon.this.a.map[Int, scala.collection.immutable.Iterable[Int]](((x$1: (java.lang.String, Int)) => x$1._2))(immutable.this.Iterable.canBuildFrom[Int])
        };
        {
          new $anon();
          ()
        }
      }
    }
  }
}

これでmapメソッドの暗黙の引数にimmutable.this.Iterable.canBuildFrom[Int]が使われていることがわかる。