Поделиться через


Функция 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

См. также

Ссылки

Модуль Collections.Seq (F#)

Пространство имен Microsoft.FSharp.Collections (F#)