22 votes

Comment l'implicite <:< aide à trouver les paramètres de type

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.

3voto

Travis Brown Points 56342

Comme pedrofurla a commenté vous avez raison, à une petite réserve près. Vous dites que le compilateur "tire" conforms[Traversable[A]] mais il n'y a vraiment pas besoin d'une telle instance ici. Prenons un exemple simplifié où l'on sait très bien quels implicites sont concernés :

trait Foo[-From, +To]

implicit object intListFoo extends Foo[List[Int], List[Int]]

Maintenant, il n'y a certainement pas Foo[Traversable[Int], Traversable[Int]] autour, mais nous peut écrivez ce qui suit :

scala> implicitly[Foo[List[Int], Traversable[Int]]]
res0: Foo[List[Int],Traversable[Int]] = intListFoo$@8e760f2

C'est plus ou moins la même chose qui se passe dans votre exemple. Dans ce cas, nous aurions une instance Traversable[Int] <:< Traversable[Int] si nous en avions besoin, mais nous ne le faisons pas pour cette recherche implicite spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X