Quelques questions se posent alors que je lis la section 7.3.2 Capturer les contraintes de type du livre Scala in Depth de Joshua. L'exemple extrait du livre :
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))
Il semble évident que C
se trouve être List[Int]
par le 1er paramètre liste. Et comment <:<
L'application de la contrainte de type par variance est expliquée dans le livre. Mais je ne vois pas très bien comment cela aide à trouver A
.
Si je comprends bien, à partir de la première liste de paramètres, Scala trouve C: List[Int]
, puis il cherche implicit ev: <:<[List[Int], Traversable[A]]
. A l'heure actuelle A
reste inconnu. Il "tire" deux implicites conforms[List[Int]]
et conforms[Traversable[A]]
à correspondre à ev
. Dans les deux cas, pour satisfaire la variance, List[Int] <: Traversable[A]
doit être satisfaite, ce qui conduit à la conclusion que A
est Int
.
Est-ce que cela fonctionne comme ce que je décris ici ? En particulier sur comment/quand A
est déduit.