Несколько вопросов возникают, когда я читаю 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
выводится.