2014-04-15 25 views

Trả lời

19

Điều này được gọi là loại linh hoạt. Tóm tắt ngắn gọn là #type có nghĩa là mọi loại loại được kế thừa từ type. Vì vậy, trong ví dụ cụ thể của bạn seq<#seq<'a>> sẽ là một chuỗi bất kỳ bộ sưu tập nào có chứa các giá trị 'a.

Khi gọi hàm, F # tự động tạo kiểu cụ thể cho giao diện - ví dụ: bạn có thể gọi hàm seq<'a> với mảng 'a[] làm đối số. Tuy nhiên, điều này không hoạt động khi bạn có mảng mảng - bởi vì 'a[][] chỉ thực hiện seq<'a[]> nhưng không hoạt động seq<seq<'a>>.

Ví dụ, hai chức năng sau trở lại danh sách các độ dài của chuỗi lồng nhau:

let f1 (s:seq<seq<'T>>) = [ for i in s -> Seq.length i ] 
let f2 (s:seq<#seq<'T>>) = [ for i in s -> Seq.length i ] 

Nhưng chỉ một giây có thể được gọi vào danh sách của danh sách:

[ [1]; [2;3] ] |> f1 
// error FS0001: The type 'int list list' is not 
// compatible with the type 'seq<seq<'a>>' 

[ [1]; [2;3] ] |> f2 
// val it : int list = [1; 2] 
Các vấn đề liên quan