सवाल इस पैटर्न encapsulating के लिए एक पुस्तकालय समारोह है कि क्या वहाँ उत्तर देने के लिए - वहाँ एक समारोह वास्तव में इस के लिए नहीं है, लेकिन वहाँ एक समारोह से कुछ राज्य Seq.unfold
कहा जाता है आप अनुक्रम उत्पन्न करने के लिए अनुमति देता है । आप इस तरह से ऊपर कार्यक्षमता को लागू करने के लिए इसका इस्तेमाल कर सकते हैं:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
sr
मूल्य धारा पाठक का प्रतिनिधित्व करता है और राज्य के रूप में पारित कर दिया है। जब तक यह आपको गैर-शून्य मान देता है, तो आप Some
को उत्पन्न करने के लिए तत्व बना सकते हैं और राज्य (जो आप चाहते थे तो बदल सकता है)। जब यह null
पढ़ता है, तो हम इसका निपटान करते हैं और अनुक्रम को समाप्त करने के लिए None
लौटाते हैं। यह प्रत्यक्ष समतुल्य नहीं है, क्योंकि जब कोई अपवाद फेंक दिया जाता है तो यह ठीक से StreamReader
का निपटान नहीं करता है।
इस मामले में, मैं निश्चित रूप से अनुक्रम अभिव्यक्ति का उपयोग करता हूं (जो अधिकतर मामलों में अधिक सुरुचिपूर्ण और अधिक पठनीय है), लेकिन यह जानना उपयोगी है कि इसे उच्च-आदेश फ़ंक्शन का उपयोग करके भी लिखा जा सकता है।
स्रोत
2010-03-02 22:14:14
धन्यवाद! बीटीडब्ल्यू, क्या इसके लिए लाइब्रेरी फ़ंक्शन है? –
@ डेविड - निश्चित रूप से होना चाहिए। मेरा मानना है कि .NET पुस्तकालय धीरे-धीरे अधिक IENumerable इंटरफेस की तरफ बढ़ रहे हैं। – ChaosPandion
मुझे किसी अन्य प्रक्रिया द्वारा पहले से खोला गया फ़ाइल पढ़ने की आवश्यकता है, इसलिए मैंने इस प्रकार संशोधित किया: 'fs = new fileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) का उपयोग करें; sr = new StreamReader (fs) ' – User