2012-02-25 19 views

Trả lời

15

Không, không phải tất cả các tập quán đều có thể được chuyển đổi. Một cái gì đó như thế này (nhờ retronym, dưới đây, ai sẽ được nhận được upvotes trên này)

def foo(xs: Map[T, T] forSome { type T}) 

Vấn đề ở đây là tôi có thể sử dụng tính tồn tại trong hơn một nơi nhưng nó là như nhau tồn tại. Rõ ràng, nếu bạn sử dụng các ký tự đại diện, bạn sẽ đề cập đến các hiện tượng khác nhau

+0

Trong ví dụ này; Không. Thành thật mà nói, tôi không chắc chắn 100% đó là cú pháp hợp lệ và chưa có cơ hội để kiểm tra. Nhưng tôi đã thấy các ví dụ dọc theo các dòng tương tự –

+0

Thật vậy, tôi chỉ thử nó với scala 2.9.1 và ** nó không biên dịch **! Bạn có thể sửa chữa nó, tôi không thể làm điều đó cho bạn, tôi đã không bao giờ sử dụng/cần thiết 'forSome' xây dựng. – paradigmatic

+0

Cố định dọc theo các dòng được đề xuất bởi từ viết tắt –

14

_ trong ngữ cảnh này là "Cú pháp giữ chỗ cho các loại hiện có", được mô tả trong 3.2.10 của language specification.

Tên âm thanh rất giống với cách sử dụng khác của _, "Cú pháp trình giữ chỗ cho chức năng ẩn danh". Thuật toán này không thể được sử dụng cho tất cả các chức năng. Ví dụ:

(a: A) => f(g(a)) 
f(g(_: A)) // WRONG, this means f((a: A) => g(a)) 

Chúng ta có thể xây dựng một ví dụ tương tự cho existentials, mà không thể được đại diện _:

F[G[A]] forSome { type A } 
F[G[_]] // WRONG, this means F[G[A] forSome { type A }] 

Side lưu ý: existentials là không mức loại tương tự của các chức năng mức giá trị . Đó sẽ là:

({type l[A] = F[G[A]])#l 

Thực tế, điều đáng tiếc là Scala sử dụng dấu gạch dưới cho các tồn tại, thay vì chức năng mức loại.

CẬP NHẬT

Hãy để tôi khung @oxbow_lakes 'câu trả lời trong cùng một cách:

(a: A) => h(a, a) 
h(_, _) // WRONG, this means (a, b) => f(a, b) 

H[A, A] forSome { type A } 
H[_, _] // WRONG, this means H[A, B] forSome { type A; type B } 
+0

Sự khác biệt giữa F [G [A]] forSome {type A} và F [G [A] forSome {type A}] là gì? – user482745