Um die Frage zu beantworten, ob es eine Bibliotheksfunktion gibt, um dieses Muster zu kapseln - es gibt genau keine Funktion dafür, aber es gibt eine Funktion, die es Ihnen ermöglicht, eine Sequenz aus einem bestimmten Zustand zu generieren, namens Seq.unfold
. Sie können sie verwenden, um die Funktionalität wie oben implementieren:
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
Der Wert sr
repräsentiert den Stream-Reader und wird als Zustand übergeben. Solange er Ihnen nicht-Null-Werte liefert, können Sie Some
zurückgeben, das ein Element zur Generierung und den Zustand (der sich ändern könnte, wenn Sie wollten) enthält. Wenn es null
liest, entsorgen wir es und geben None
zurück, um die Sequenz zu beenden. Dies ist keine direkte Entsprechung, da der StreamReader
nicht ordnungsgemäß entsorgt wird, wenn eine Ausnahme ausgelöst wird.
In diesem Fall würde ich definitiv Sequenzausdruck verwenden (der in den meisten Fällen eleganter und lesbarer ist), aber es ist nützlich zu wissen, dass es auch mit einer Funktionsaufruf geschrieben werden könnte.