この状況でのコンパイラの動作を理解しようとしています
object ImplicitTest extends App {
def foo[T](implicit x: (String => T)): T = ???
implicit val bar = (x: String) => x.toInt
foo
}
上記のコードはコンパイルされず、次のエラーが発生します。
あいまいな暗黙の値: 型 [A] のオブジェクト Predef のメソッド $conforms ⇒ <:<[A,A] と、型 ⇒ String ⇒ Int のオブジェクト ImplicitTest の値 bar の両方が期待される型 String ⇒ T に一致します。
エラーは、暗黙の値が Predef で定義された別の暗黙の値と競合していることを示しているため、これに基づいて、既知の型から未知の (ジェネリック) 型に値を変換する関数に暗黙のパラメーターを宣言する方法がないようです。
これは、コンパイラの技術的な制限によるものですか、それとも動作するはずの方法であり、私が認識していないいくつかの制約に違反していますか?