Pojawia się kilka pytań podczas czytania 7.3.2 Przechwytywanie ograniczeń typu ze Scala Joshua w głębi. Przykład zaczerpnięty z książki:W jaki sposób niejawny <: <pomaga znaleźć parametry typu
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))
Wydaje się oczywiste, że C
okaże się List[Int]
przez 1st listy parametr . I jak <:<
wymusza ograniczenie typu według wariancji wyjaśniono w książce. Ale nie bardzo rozumiem, jak to pomaga znaleźć A
.
Moje zrozumienie, z 1. listy parametrów, scala dowiaduje się, że C: List[Int]
, to wtedy szuka implicit ev: <:<[List[Int], Traversable[A]]
. W tej chwili A
pozostaje nieznany. "Ściąga" dwa implicity conforms[List[Int]]
i conforms[Traversable[A]]
na mecz ev
. W obu przypadkach, aby spełnić wariancję, musi być spełnione List[Int] <: Traversable[A]
, co prowadzi do stwierdzenia, że A
jest Int
.
Czy to działa tak, jak to opisuję tutaj? Zwłaszcza o tym, jak/kiedy wyprowadzono A
.
Tak, działa tak, jak opisujesz. – pedrofurla
@pedrofurla dziękuję – cfchou
@pedrofurla Możesz to zgłosić jako odpowiedź :) – huitseeker