2011-03-25 22 views

Trả lời

15

Đây là một tác động phức tạp trộn hiệp biến và bộ sưu tập bất biến. Đặt là bất biến: Set[A]. Nhưng Seq là biến thể: Seq[+A]. Bây giờ, hãy tưởng tượng bạn muốn có phương thức toSet trong Seq của bạn. Bạn có thể thử toSet: Set[A]. Nhưng điều này sẽ không hoạt động, bởi vì nếu A là một phân lớp của B thì Seq[A] phải được xem là lớp con của Seq[B]. Tuy nhiên, Seq[A] khẳng định khi trả lại số Set[A]không phải là một lớp con của Seq[B]. Vì vậy, đánh máy của chúng tôi bị hỏng.

Nếu, mặt khác, chúng tôi chỉ định toSeq[B >: A]: Set[B] sau đó mọi thứ đều tốt: nếu chúng tôi hứa chúng ta có thể trả lại bất kỳ lớp cha, sau đó có thể trở lại Seq[A]Set[B] cũng như Set[C] nơi C là một lớp cha của B. Seq[B] hứa sẽ trả lại Set[B] hoặc một số Set[C] cũng vậy, vì vậy chúng tôi đang rõ ràng: phương pháp trên Seq[A] có thể làm mọi thứ mà phương pháp trên Seq[B] có thể thực hiện.

Nhưng bây giờ nhìn vào những gì các typer nghèo đang phải đối mặt với:

s.toSet[B >: I] 
.toSeq/* Type B >: I*/ 
.sortBy[C](/* some f:B => C */)(/* implicit ordering on C */) 

một cách để giải quyết này - cụ thể để quyết định rằng BI và gõ các chức năng và C cho phù hợp. Nhưng nó trở thành một tìm kiếm khá phức tạp, và nó còn hơn cả trình biên dịch có thể xử lý ngay bây giờ. Vì vậy, nó yêu cầu bạn để giúp nó ra với các loại đầu vào cho chức năng để nó biết B tại thời điểm đó (và sau đó có thể tuyên truyền nó trở lại toSet).

Nhưng bạn có thể, nếu bạn muốn, giúp nó ra tại một số cấp:

s.toSet[I].toSeq.sortBy(_.i) 
s.toSet.toSeq.sortBy[Int](_.i) 

hoặc bạn có thể giúp nó ra bằng cách chứng minh với nó rằng nó không cần phải xem xét các loại sau khi chọn phù hợp nhất với các loại trước đó:

{ val temp = s.toSet; temp }.toSeq.sortBy(_.i) 
s.toSet match { case x => x.toSeq.sortBy(_.i) } 
+0

Rex, cảm ơn vì sự giác ngộ đó, đó là điều tôi muốn. Những câu trả lời như vậy không chỉ giải quyết vấn đề, nó còn cho tôi một sự hiểu biết sâu sắc hơn về những gì đang xảy ra. Cảm ơn nhiều! Thật đáng tiếc, người ta chỉ có thể upvote một lần: D –

0

Dường như về điều gì đó cần làm với suy luận kiểu, tôi không biết khá rõ.

Nhưng cả hai sau làm các trick:

+0

Vâng, tôi biết cách khắc phục sự cố, nhưng tại sao nó vẫn tồn tại trong trường hợp của tôi? Nó không phải là trực giác. –

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