2012-05-17 20 views
9

F # có cả hai mã được đánh máy và không được nhập mã và tôi tự hỏi các trường hợp sử dụng là nơi nào người ta chọn cái kia?Khi nào được ưu tiên không phân loại trên các trích dẫn đã nhập trong F #?

Sự khác biệt chỉ là các báo giá thuận tiện và không được nhập sai và được nhập có thể chuyển đổi thành mỗi trong mọi trường hợp hoặc được trích dẫn e. g. một tập con của những người có thể với các trích dẫn không được phân loại?

Có bất kỳ ví dụ nào chỉ hoạt động với được nhập, nhưng không phải với các trích dẫn không được phân loại - hay cách khác xung quanh?

Trả lời

7

Nói chung, tôi khuyên bạn nên sử dụng các trích dẫn đã nhập bất cứ khi nào bạn có thể. Như thường lệ, các loại sẽ cho phép bạn thực thi tĩnh một số điều kiện chính xác có thể gây ra lỗi trong thời gian chạy. Xem xét:

let one = <@@ "one" @@> 
// exception at runtime 
let two = <@@ 1 + %%one @@> 

như trái ngược với

let one = <@ "one" @> 
// compile time error: the type 'string' does not match the type 'int' 
let two = <@ 1 + %one @> 

Bên cạnh đó, đôi khi trích dẫn untyped cần chú thích loại bổ sung trong trường hợp trích dẫn gõ không:

// ok 
let l = <@ [1] @> 
let l2 = <@ List.map id %l @> 

// fails at runtime (obj list assumed instead of int list) 
let l = <@@ [1] @@> 
let l2 = <@@ List.map id %%l @@> 

// ok 
let l = <@@ [1] @@> 
let l2 = <@@ List.map (id:int->int) %%l @@> 

Tuy nhiên, nếu bạn xây dựng một cái gì đó cực kỳ chung chung ra khỏi danh ngôn, nó có thể không được sử dụng trích dẫn gõ (ví dụ, vì các loại không được biết đến tĩnh). Trong ý nghĩa đó, các trích dẫn không được giải thích cho bạn linh hoạt hơn. Cũng cần lưu ý rằng nó rất dễ chuyển đổi giữa các trích dẫn đã nhập và không được nhập khi cần thiết (upcast một số Expr<_> đến Expr để chuyển từ gõ thành không được gõ, sử dụng Expr.Cast để đi theo cách khác).

3

Thông thường, người tiêu dùng thư viện xử lý báo giá sẽ sử dụng các trích dẫn đã nhập. Trong khi đó, việc xử lý báo giá tác giả cần phải hoạt động với các trích dẫn không được nhập.

Nghĩa là, bạn sẽ không thường trực tiếp tạo các trích dẫn không được nhập bằng cách sử dụng toán tử (<@@ @@>). Tuy nhiên, để đệ quy xử lý báo giá bằng cách sử dụng các mẫu hoạt động của thư viện lõi F # khác nhau, chẳng hạn như mô-đun Quotations.Patterns, bạn làm việc với các trích dẫn ở dạng không được gõ của chúng.

Lưu ý rằng Expr<'T> mở rộng Expr và không thực sự thêm nhiều thông tin vào nó. Nghĩa là, các trích dẫn được đánh máy thực sự chỉ là một ảo ảnh, tất cả các siêu dữ liệu đã chụp nằm trong đối tượng Expr và chỉ có sẵn khi chạy.