2012-02-19 24 views
5

Vì vậy, nếu bạn muốn viết ra một dòng vào giao diện điều khiển trong F #, bạn làm như sau:chức năng ẩn danh và phương pháp quá tải trong F #

System.Console.WriteLine "foo" 

Ban đầu tôi nghĩ sau đây đã được khá nhiều giống hệt nhau, chỉ hơn tiết, nhưng trên thực tế nó mang lại cho các lỗi "Một quá tải duy nhất cho phương pháp 'WriteLine' không thể được xác định dựa vào loại thông tin trước khi đến thời điểm chương trình này":

(fun line -> System.Console.WriteLine line) "foo" 

có vẻ như phiên bản thứ hai được nhầm lẫn bởi sự hiện diện của quá tải WriteLine phương pháp mà có một chuỗi cũng như các đối số khác. Giả định của tôi có đúng đường không?

Trả lời

12

Không chính xác. Trong trường hợp đầu tiên, lời gọi hàm biết rằng nó đang được áp dụng cho một chuỗi ký tự, vì vậy nó có thể thực hiện độ phân giải quá tải để tìm chuỗi quá tải.

Trong trường hợp thứ hai, line là biến loại chưa được giải quyết để nhập suy luận tại điểm gọi đến phương thức quá tải WriteLine, vì vậy nó không biết quá tải để chọn và không thấy đối số chuỗi tuy nhiên, khi suy luận kiểu là từ trái sang phải.

Thay đổi nó để

"foo" |> (fun line -> System.Console.WriteLine line) 

và nó sẽ làm việc, bởi vì kiểu biến suy luận cho line sẽ được thống nhất với string từ "foo" đến, trước nó cần phải xác định WriteLine gọi.

Vì vậy, khóa chính là suy luận kiểu từ trái sang phải; trong trường hợp không có giải pháp cho biến kiểu, có thể không thể chọn quá tải.

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