2009-10-09 3 views

Trả lời

44

Vâng ... f() lấy một chuỗi làm tham số. Cấu trúc _.toString có loại A <: Any => String. Hàm f() mong đợi một loại String, vì vậy ví dụ ở trên không nhập kiểm tra. Dường như Scala rất thân thiện trong trường hợp này và cho người dùng một cơ hội khác. Thông báo lỗi có nghĩa là: "Bằng thuật toán suy luận kiểu của tôi, điều này không biên dịch. Đặt các loại vào và nó có thể, nếu đó là điều tôi không thể suy ra."

Bạn sẽ phải viết hàm chức năng ẩn danh trong trường hợp này, tức là a.map(n => f(n.toString)). Đây không phải là giới hạn của suy luận kiểu, mà là biểu tượng ký tự đại diện. Về cơ bản, khi bạn viết a.map(f(_.toString)), các _.toString được mở rộng thành một chức năng ẩn danh bên trong dấu ngoặc đơn gần nhất nó có thể tìm thấy, nếu không điều này sẽ dẫn đến sự mơ hồ rất lớn. Hãy tưởng tượng một cái gì đó như f(g(_.toString)). Điều này có nghĩa là f(g(x => x.toString)) hoặc f(x => g(x.toString))? Sự mơ hồ tồi tệ hơn sẽ phát sinh cho nhiều cuộc gọi hàm lồng nhau. Do đó, trình kiểm tra kiểu Scala có giải pháp hợp lý nhất, như được mô tả ở trên.

Nitpick: dòng đầu tiên của mã của bạn phải là val a = List(1,2,3,4) :).