2013-04-14 21 views
22

Một vài câu hỏi phát sinh trong khi tôi đang đọc 7.3.2 Ghi lại các ràng buộc loại từ Scala của chiều sâu của Joshua. Ví dụ trích từ cuốn sách:Làm thế nào để ẩn <: <giúp tìm các thông số kiểu

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ó vẻ như đơn giản mà C được tìm thấy là List[Int] bởi 1 danh sách tham số . Và cách thức ràng buộc loại thực thi <:< bằng phương sai được giải thích trong sách. Nhưng tôi hoàn toàn không thấy cách giúp tìm A.

Sự hiểu biết của tôi là, từ danh sách tham số 1, scala phát hiện ra C: List[Int], sau đó tìm kiếm implicit ev: <:<[List[Int], Traversable[A]]. Hiện tại, A vẫn chưa được biết. Nó "kéo" hai implicits conforms[List[Int]]conforms[Traversable[A]] đến khớp với ev. Trong cả hai trường hợp để thỏa mãn phương sai, List[Int] <: Traversable[A] phải được thỏa mãn, dẫn đến kết quả là AInt.

Ứng dụng có hoạt động như những gì tôi mô tả ở đây không? Đặc biệt là làm thế nào/khi A được suy luận.

+1

Có, nó hoạt động như bạn mô tả. – pedrofurla

+0

@pedrofurla cảm ơn bạn – cfchou

+2

@pedrofurla Bạn có thể muốn gửi câu trả lời đó dưới dạng câu trả lời :) – huitseeker

Trả lời

3

pedrofurla commented, bạn đã hiểu đúng - với một trình độ nhỏ. Bạn nói rằng trình biên dịch "kéo" conforms[Traversable[A]], nhưng thực sự không cần cho bất kỳ ví dụ nào ở đây. Để lấy một ví dụ đơn giản mà nó rất rõ ràng những gì implicits là trong phạm vi:

trait Foo[-From, +To] 

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

Bây giờ có chắc chắn không Foo[Traversable[Int], Traversable[Int]] xung quanh, nhưng chúng tôi thể viết như sau:

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

Nhiều hay ít chính xác điều tương tự đang xảy ra trong ví dụ của bạn. Trong trường hợp đó, chúng ta sẽ có một cá thể Traversable[Int] <:< Traversable[Int] xung quanh nếu chúng ta cần nó, nhưng chúng tôi không tìm kiếm tiềm ẩn cụ thể đó.

Các vấn đề liên quan