Tôi nghĩ rằng cách tiếp cận của bạn là tốt trong trường hợp này. Không có chức năng built-in để thực hiện lặp đi lặp lại, nhưng nếu bạn cần lặp lại trình tự thông thường, bạn có thể xác định một mình và làm cho nó có sẵn trong Seq
mô-đun:
module Seq =
let repeat items =
seq { while true do yield! items }
Sau đó, bạn độc đáo có thể viết Seq.repeat [ 1 .. 4 ]
, như thể repeat
là chức năng thư viện chuẩn F #, vì F # IntelliSense hiển thị cả hai hàm từ mô-đun Seq
của bạn và từ mô-đun Seq
như thể chúng được xác định trong một mô-đun duy nhất.
Ngoài việc triển khai, bạn cũng có thể sử dụng biểu thức trình tự đệ quy, đó là một mẫu khá phổ biến khác khi tạo chuỗi. Sử dụng while
là trong một số cách bắt buộc (mặc dù bạn không cần bất cứ tiểu bang cho lần lặp lại đơn giản) so với đệ quy chức năng:
let rec repeat items =
seq { yield! items
yield! repeat items }
Cách tiếp cận này là tốt hơn khi bạn muốn giữ lại một số trạng thái trong khi tạo ra. Ví dụ: tạo tất cả các số 1 ..
bằng cách sử dụng while
sẽ không đẹp như vậy, vì bạn cần trạng thái có thể thay đổi. Sử dụng đệ quy, bạn có thể viết những điều tương tự như:
let rec numbersFrom n =
seq { yield n
yield! numbersFrom (n + 1) }
Nguồn
2012-01-18 23:48:56
Một Gotcha ở đây: 'Seq.initInfinite' chỉ tạo ra các chuỗi vô hạn cho các giá trị vô hạn nhất định. Từ [tài liệu] (http://msdn.microsoft.com/en-us/library/ee370429.aspx): "Lặp lại có thể tiếp tục tới Int32.MaxValue." –
Nó phù hợp với định nghĩa cốt lõi của lib về vô hạn, đó là một định nghĩa làm việc có thể sử dụng. – Daniel