2015-01-06 16 views
5

Dưới đây là một thử nghiệm đơn giản trong Scala REPL:Lỗi, Loại được đánh giá cao hơn Scala: đối số kiểu không phù hợp. gõ giới hạn T là nghiêm ngặt hơn loại T tuyên bố giới hạn

scala> trait A; trait B extends A; trait C extends B 
defined trait A 
defined trait B 
defined trait C 

scala> trait TC[T] 
defined trait TC 

scala> trait TC2[T <: B] 
defined trait TC2 

scala> class Test[TC[T]] 
warning: there was one feature warning; re-run with -feature for details 
defined class Test 

scala> new Test[TC] 
res1: Test[TC] = [email protected] 

scala> new Test[TC2] 



<console>:11: error: kinds of the type arguments (TC2) do not conform to the expected kinds of the type parameters (type TC) in class Test. 
TC2's type parameters do not match type TC's expected parameters: 
type T (in trait TC2)'s bounds <: B are stricter than type T's declared bounds >: Nothing <: Any 
     val res2 = 
     ^
<console>:12: error: kinds of the type arguments (TC2) do not conform to the expected kinds of the type parameters (type TC) in class Test. 
TC2's type parameters do not match type TC's expected parameters: 
type T (in trait TC2)'s bounds <: B are stricter than type T's declared bounds >: Nothing <: Any 
       new Test[TC2] 
       ^

Câu hỏi 1:

Làm thế nào có thể các thông báo lỗi được giải thích dựa trên Scala Language Specification ?

Nói cách khác, các phần nào của SLS giải thích các thông báo lỗi này?

Câu hỏi 2:, làm thế nào có thể các thông báo lỗi được giải thích trong thuật ngữ đơn giản (không dựa trên SLS)?

phân nhịp câu hỏi trước trong lời nói của trình biên dịch:

lý do tại sao nó là một vấn đề mà TC2's type parameters do not match type TC's expected parameters, ví dụ: type T (in trait TC2)'s bounds <: B are stricter than type T's declared bounds >: Nothing?

Có bất kỳ cuốn sách hoặc bài viết nào mà lý do đằng sau thông báo lỗi này được giải thích không?

Có lẽ đâu đó trong cuốn sách TAPL của Pierce?

+2

Lưu ý rằng bạn' re shadowing 'TC' trong' Test'. Sử dụng tên biến mới (ví dụ: 'kiểm tra lớp [X [T]]') làm cho thông báo rõ ràng hơn. –

Trả lời

7

Như tôi đã lưu ý trong một chú thích ở trên, TC trong danh sách tham số kiểu của Test (và trong thông báo lỗi) không phải là TC mà bạn định nghĩa một vài dòng trước-đó là một kiểu mới constructor tham số rằng làm nổi bật đặc tính TC.

(Như một mặt lưu ý, tôi muốn mạnh mẽ đề nghị không shadowing tham số kiểu. Shadowing biến ở mức giá trị có thể là đủ khó hiểu, nhưng shadowing thông số loại hầu như luôn luôn là một công thức cho sự nhầm lẫn.)

Loại constructor các tham số được thảo luận trong phần 4.4 của spec. Từ phần đó:

A type constructor parameter adds a nested type parameter clause to the type parameter... The above scoping restrictions are generalized to the case of nested type parameter clauses, which declare higher-order type parameters. Higher-order type parameters (the type parameters of a type parameter t) are only visible in their immediately surrounding parameter clause (possibly including clauses at a deeper nesting level) and in the bounds of t.

T Đây là một trong các thông số loại thứ tự cao hơn này. Nó có thể được bao bọc (giống như bất kỳ tham số kiểu nào khác), nhưng nó không phải. Đây là nguyên nhân gây ra lỗi: bạn đang cố gắng cung cấp một hàm tạo kiểu để ràng buộc tham số kiểu của nó (TC2) làm giá trị của tham số hàm tạo không chia sẻ ràng buộc (thực tế không có bất kỳ ràng buộc nào tại tất cả các).

Để có được một cảm giác trực quan về việc tại sao đây là một vấn đề, xem xét các đặc điểm sau:

trait Foo[X[_]] { 
    def create[A]: X[A] 
} 

Đây là một điều hoàn toàn hợp lý để viết-I có thể tạo ra một thể hiện ví dụ như thế này:

object ListFoo extends Foo[List] { 
    def create[A]: List[A] = Nil 
} 

Bây giờ giả sử tôi có một loại nhà xây dựng với một hạn chế:

trait MyIntOptionThingy[A <: Option[Int]] 

T trình biên dịch ngăn cấm tôi khởi tạo một Foo[MyIntOptionThingy] vì tham số kiểu của MyIntOptionThingy bị ràng buộc chặt chẽ hơn tham số kiểu của X trong danh sách tham số kiểu của Foo.Nếu bạn nghĩ về điều này có ý nghĩa: làm cách nào để tôi có thể xác định create cho bất kỳ A nào, khi chỉ A s hoạt động cho MyIntOptionThingySome[Int], None.typeOption[Int]?

+0

Cảm ơn bạn rất nhiều vì câu trả lời chi tiết và chỉ ra vấn đề về bóng tối. – jhegedus

+0

Tôi tự hỏi nếu loại lỗi này được giải thích cũng ở đâu đó trong http://lampwww.epfl.ch/~odersky/papers/mfcs06.pdf – jhegedus

+0

Từ bài báo: "Một mục tiêu quan trọng trong developping Featherweight Scala là để cho thấy rằng Scala của "nhưng các loại được đánh giá cao hơn có thể dẫn đến việc kiểm tra loại có thể không kết thúc, vì vậy bài báo không bao gồm các loại có mức độ cao hơn, vì vậy bài báo không cung cấp bất kỳ trợ giúp nào trong việc hiểu hành vi này. – jhegedus

0

Vì lợi ích của sự hoàn chỉnh tôi trích dẫn một số bộ phận có thể có liên quan của SLS:

enter image description here

Về sự phù hợp của các loại nhà xây dựng từ SLS 3.5.2:

enter image description here

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