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
推定されるかについて。