Несколько вопросов возникают, когда я читаю 7.3.2 Ограничения типа захвата от Джошуа Scala в глубину. Пример, взятый из книги:
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))
Кажется очевидным, что C оказывается List[Int] по 1-му параметру
список. И как <:< применяет ограничение типа по дисперсии, объясняется в книге.
Но я не совсем понимаю, как это помогает найти A.
Я понимаю, что из первого списка параметров Scala обнаруживает C: List[Int],
то он ищет implicit ev: <:<[List[Int], Traversable[A]].
На данный момент A остается неизвестным.
Он "тянет" два имплицита conforms[List[Int]] и conforms[Traversable[A]] в
соответствие ev. В любом случае для удовлетворения дисперсии должно выполняться List[Int] <: Traversable[A], что приводит к выводу, что A Int.
Работает ли он так, как я описываю здесь? Особенно в том, как/когда A выводится.