Joshua の Scala in Depth から 7.3.2 Capturing type Constraints を読んでいると、いくつかの疑問が生じます。本から抜粋した例:
scala> def peek[C, A](col: C)(implicit ev: C <:< Traversable[A]) = (col.head, col)
peek: [C, A](col: C)(implicit ev: <:<[C,Traversable[A]])(A, C)
scala> peek(List(1, 2, 3))
res9: (Int, List[Int]) = (1,List(1, 2, 3))
第 1 パラメーター リストCでわかるのは簡単なようです。また、バリアンスによる型制約をList[Int]どのように強制するかについては、本で説明されています。<:<しかし、それが を見つけるのにどのように役立つかはよくわかりませんA。
私の理解では、最初のパラメーター リストから、scala は を見つけC: List[Int]、次に を探しimplicit ev: <:<[List[Int], Traversable[A]]ます。現時点でAは不明のままです。conforms[List[Int]]2 つの暗黙の とを「プル」conforms[Traversable[A]]して一致させevます。どちらの場合でも、分散を満たすにList[Int] <: Traversable[A]は、 を満たす必要があり、これにより、 という結果が得られAますInt。
ここで説明しているように機能しますか?特にどのように/いつA推定されるかについて。