Để trả lời câu hỏi liệu có một chức năng thư viện để đóng gói mô hình này - không có một chức năng chính xác cho điều này, nhưng có một chức năng cho phép bạn tạo ra chuỗi từ một số trạng thái gọi là Seq.unfold
. Bạn có thể sử dụng nó để triển khai chức năng ở trên như thế này:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
Giá trị sr
đại diện cho trình đọc luồng và được chuyển qua trạng thái. Miễn là nó cung cấp cho bạn các giá trị không null, bạn có thể trả lại Some
chứa một phần tử để tạo và trạng thái (có thể thay đổi nếu bạn muốn). Khi nó đọc null
, chúng tôi vứt bỏ nó và trả về None
để kết thúc chuỗi. Đây không phải là một tương đương trực tiếp, bởi vì nó không xử lý đúng cách StreamReader
khi một ngoại lệ được ném. Trong trường hợp này, tôi chắc chắn sẽ sử dụng biểu thức trình tự (có vẻ thanh lịch và dễ đọc hơn trong hầu hết các trường hợp), nhưng rất hữu ích khi biết rằng nó cũng có thể được viết bằng chức năng bậc cao hơn.
Nguồn
2010-03-02 22:14:14
Cảm ơn! Btw, có chức năng thư viện nào không? –
@David - Chắc chắn phải có. Tôi tin rằng các thư viện .NET đang dần chuyển sang các giao diện IEnumerable hơn. – ChaosPandion
Tôi cần phải đọc một tập tin đã được mở bởi một quá trình khác vì vậy tôi sửa đổi như: 'sử dụng fs = new FileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); sử dụng sr = new StreamReader (fs) ' – User