Khía cạnh của F # mà gây ra điều này được gọi là giá trị hạn chế. Bạn có thể thấy rằng nếu bạn nhập chỉ có hai let
tờ khai để F # Interactive (do đó trình biên dịch không suy ra các loại từ việc sử dụng đầu tiên):
> let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder ;;
lỗi FS0030: hạn chế giá trị gia tăng. Giá trị 'chắp thêm' đã được suy ra để có loại giá trị bổ sung val chung: ('_a ->' _b) khi '_a:> Printf.BuilderFormat <' _b> Hoặc làm cho các đối số 'nối thêm' rõ ràng hoặc, nếu bạn không có ý định cho nó là chung chung, thêm chú thích kiểu.
Có một số excellent article by Dmitry Lomov từ nhóm F # giải thích chi tiết. Như bài viết cho thấy, một giải pháp là thêm khai báo tham số kiểu rõ ràng:
let builder = new System.Text.StringBuilder()
let append<'T> : Printf.BuilderFormat<'T> -> 'T = Printf.bprintf builder
append "%i" 10
append "%s" "Hello"
Điều này sẽ chỉ hoạt động tốt.
Nguồn
2010-10-28 21:35:03
Cảm ơn. Bất cứ ai có thể giải thích lý do tại sao công trình này và một phần ứng dụng không? – Daniel
Bởi vì trong .NET, các hàm có thể là generic và các biến không thể. 'let append format =' mô tả một hàm; 'let append =' mô tả một biến. –