2013-12-03 17 views
7

Tôi gặp phải vấn đề suy luận kiểu khó hiểu với các lớp chữ hoa chữ thường. Dưới đây là một ví dụ nhỏ:Kết hợp mẫu Scala infers `Any` thay vì kiểu tồn tại, phá vỡ kiểu an toàn?

trait T[X] 
case class Thing[A, B, X](a: A, f: A => B) extends T[X] 

def hmm[X](t: T[X]) = t match { 
    case Thing(a, f) => f("this really shouldn't typecheck") 
} 

Scala quyết định rằng a: Anyf: Any => Any, nhưng đó là không phù hợp; họ thực sự phải có các loại a: SomeTypeAf: SomeTypeA => SomeTypeB, trong đó SomeTypeASomeTypeB là các loại không xác định.

Một cách khác để nói điều này là tôi nghĩ rằng giả thuyết Thing.unapply phương pháp nên giống như thế

def unapply[X](t: T[X]): Option[(A, A => B)] forSome { type A; type B } = { 
    t match { 
    case thing: Thing[_, _, X] => Some((thing.a, thing.f)) 
    } 
} 

Phiên bản này mang lại cho chính xác một lỗi loại tại f("this really shouldn't typecheck").

Điều này có vẻ giống như một lỗi trong trình biên dịch hay tôi thiếu gì đó?

Chỉnh sửa: Đây là trên Scala 2.10.3.

+0

Scala có để cung cấp cho 'A' và 'b' một loại, vì vậy những gì loại nó nên cung cấp cho họ vì bạn không nói rõ những gì các loại nên được? – Noah

+0

Vâng, tôi không chắc chắn, nhưng phương thức 'unapply' tùy chỉnh hoạt động chính xác. Trình biên dịch theo dõi thực tế là 'a' và' f' có các kiểu liên quan. –

+0

Tôi đồng ý với @Noah, không có gì để đi trên trình biên dịch phải mặc định là Bất kỳ. Nhưng tôi thấy điều này có thể nguy hiểm như thế nào. –

Trả lời

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