2013-04-14 6 views
22

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.

+1

Tak, działa tak, jak opisujesz. – pedrofurla

+0

@pedrofurla dziękuję – cfchou

+2

@pedrofurla Możesz to zgłosić jako odpowiedź :) – huitseeker

Odpowiedz

3

Jako pedrofurla commented, masz rację - z jedną małą kwalifikacją. Mówisz, że kompilator "ściąga" conforms[Traversable[A]], ale naprawdę nie ma potrzeby, aby takie wystąpienie było tutaj. Aby wziąć uproszczony przykład, gdzie jest bardzo jasne, co implicits są w zakresie:

trait Foo[-From, +To] 

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

teraz jest zdecydowanie nie Foo[Traversable[Int], Traversable[Int]] wokół, ale może napisać następujące:

scala> implicitly[Foo[List[Int], Traversable[Int]]] 
res0: Foo[List[Int],Traversable[Int]] = [email protected] 

Mniej lub bardziej dokładnie to samo dzieje się w twoim przykładzie. W takim przypadku będziemy mieli instancję Traversable[Int] <:< Traversable[Int] wokół, jeśli jest potrzebna, ale nie dla tego konkretnego niejawnego wyszukiwania.