Функция Seq.unfold<'State,'T> (F#)
Возвращает последовательность, в которой содержатся элементы, сгенерированные в результате данного вычисления.
Пространство имен/путь к модулю: Microsoft.FSharp.Collections.Seq
Сборка: FSharp.Core (в FSharp.Core.dll)
// Signature: Seq.unfold : ('State -> ('T * 'State) option) -> 'State -> seq<'T> // Usage: Seq.unfold generator state
Параметры
generator
Тип: 'State -> 'T * 'State optionФункция, берущая текущее состояние и возвращающая кортеж параметров следующего элемента в последовательности и следующее значение состояния.
state
Тип: 'StateЗначение начального состояния.
Возвращаемое значение
Результат последовательности.
Заметки
Данный начальный аргумент state передается в генератор элементов. Для каждого IEnumerator элементы в потоке генерируются по требованию с помощью генератора элементов, пока генератор элементов не вернет значение None. Каждый вызов генератора элементов возвращает новый остаток state.
Поток будет заново вычисляться и итерироваться для последовательности при каждом запросе IEnumerator. Возвращенная последовательность может передаваться между потоками безопасно. В то же время одновременное обращение к отдельным значениям IEnumerator, сгенерированным из возвращенной последовательности, допускать нельзя.
В компилированных сборках эта функция называется Unfold. Используйте это имя, если обращаетесь к этой функции с помощью другого языка, кроме F#, или отражения.
Пример
В следующем примере кода показано, как использовать Seq.unfold для генерирования двух последовательностей. Сначала генерируется последовательность целочисленных значений. Затем генерируется последовательность чисел Фибоначчи, которая заключается в добавлении в последовательность двух предыдущих чисел. Первые два числа в последовательности Фибоначчи — это (1, 1). Они формируют начальный параметр state. Состояние на каждом этапе состоит из двух чисел, сумма которых образует следующее число Фибоначчи.
let seq1 = Seq.unfold (fun state -> if (state > 20) then None else Some(state, state + 1)) 0
printfn "The sequence seq1 contains numbers from 0 to 20."
for x in seq1 do printf "%d " x
let fib = Seq.unfold (fun state ->
if (snd state > 1000) then None
else Some(fst state + snd state, (snd state, fst state + snd state))) (1,1)
printfn "\nThe sequence fib contains Fibonacci numbers."
for x in fib do printf "%d " x
Платформы
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Сведения о версии
Версии библиотеки ядра F#
Поддерживается в версиях 2.0, 4.0, Portable