Um die Frage zu beantworten, ob es eine Bibliotheksfunktion zur Kapselung dieses Musters gibt - es gibt keine Funktion genau dafür, aber es gibt eine Funktion, mit der Sie eine Sequenz aus einem Zustand namens Seq.unfold
. Damit können Sie die obige Funktion wie folgt implementieren:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
Le site sr
Wert stellt den Stream-Reader dar und wird als Status übergeben. Solange Sie nicht-null Werte erhalten, können Sie Some
mit einem zu erzeugenden Element und dem Status (der sich nach Wunsch ändern kann). Wenn er liest null
entsorgen wir es und geben es zurück None
um die Sequenz zu beenden. Dies ist kein direktes Äquivalent, weil es nicht ordnungsgemäß entsorgt StreamReader
wenn eine Ausnahme ausgelöst wird.
In diesem Fall würde ich auf jeden Fall den Sequenzausdruck verwenden (der in den meisten Fällen eleganter und lesbarer ist), aber es ist nützlich zu wissen, dass er auch mit einer Funktion höherer Ordnung geschrieben werden kann.