Чтобы ответить на вопрос, существует ли библиотечная функция для инкапсуляции этого шаблона - для этого нет функции точно , но есть функция, которая позволяет генерировать последовательность из некоторого состояния, называемого 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
при возникновении исключения.
В этом случае я бы определенно использовал выражение последовательности (которое в большинстве случаев более изящно и более читабельно), но полезно знать, что оно также может быть записано с использованием функции более высокого порядка.