2010-10-28 44 views
6

Có thể áp dụng một phần chức năng như bprintf và ngăn không cho nó bị hạn chế dựa trên việc sử dụng ban đầu không?Giữ chức năng được áp dụng một phần chung

Tôi muốn làm như sau:

let builder = new System.Text.StringBuilder() 
let append = Printf.bprintf builder 
append "%i" 10 
append "%s" string_value 

Trả lời

8

bạn có thể thêm rõ ràng định dạng luận

let builder = new System.Text.StringBuilder() 
let append format = Printf.bprintf builder format 
append "%i" 10 
append "%s" "1" 
+0

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

+10

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. –

12

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.

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