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


Функция Seq.delay<'T> (F#)

Возвращает последовательность, полученную из указанной задержанной спецификации последовательности.

Пространство имен/путь к модулю: Microsoft.FSharp.Collections.Seq

Сборка: FSharp.Core (в FSharp.Core.dll)

// Signature:
Seq.delay : (unit -> seq<'T>) -> seq<'T>

// Usage:
Seq.delay generator

Параметры

  • generator
    Тип: unit -> seq<'T>

    Функция создания последовательности.

Возвращаемое значение

Результирующая последовательность.

Заметки

Входная функция вычисляется при каждом запросе IEnumerator для последовательности.

В скомпилированных сборках имя этой функции — Delay.При обращении к функции из языка, отличного от F#, или посредством отражения следует использовать это имя.

Пример

В следующем коде показано, как использовать Seq.delay, чтобы отложить оценку последовательности, созданную из коллекции, которая обычно оценивается сразу.

// Normally sequences are evaluated lazily.  In this case,
// the sequence is created from a list, which is not evaluated
// lazily. Therefore, without Seq.delay, the elements would be
// evaluated at the time of the call to makeSequence.
let makeSequence function1 maxNumber = Seq.delay (fun () ->
    let rec loop n acc =
        printfn "Evaluating %d." n
        match n with
        | 0 -> acc
        | n -> (function1 n) :: loop (n - 1) acc
    loop maxNumber []
    |> Seq.ofList)
printfn "Calling makeSequence."
let seqSquares = makeSequence (fun x -> x * x) 4          
let seqCubes = makeSequence (fun x -> x * x * x) 4
printfn "Printing sequences."
printfn "Squares:"
seqSquares |> Seq.iter (fun x -> printf "%d " x)
printfn "\nCubes:"
seqCubes |> Seq.iter (fun x -> printf "%d " x)                       

Output

  
  
  
  
  
  
  
  
  
  
  
  
  

В следующем примере кода показан эквивалентный предыдущему примеру код, в котором не используется Seq.delay.Обратите внимание на различие в выводе.

// Compare the output of this example with that of the previous.
// Notice that Seq.delay delays the
// execution of the loop until the sequence is used.
let makeSequence function1 maxNumber =
    let rec loop n acc =
        printfn "Evaluating %d." n
        match n with
        | 0 -> acc
        | n -> (function1 n) :: loop (n - 1) acc
    loop maxNumber []
    |> Seq.ofList
printfn "Calling makeSequence."
let seqSquares = makeSequence (fun x -> x * x) 4          
let seqCubes = makeSequence (fun x -> x * x * x) 4
printfn "Printing sequences."
printfn "Squares:"
seqSquares |> Seq.iter (fun x -> printf "%d " x)
printfn "\nCubes:"
seqCubes |> Seq.iter (fun x -> printf "%d " x)

Output

  
  
  
  
  
  
  
  
  
  
  
  
  

Платформы

Windows 8, Windows 7, Windows Server 2012, Windows 2008 Server R2

Сведения о версии

Основной версии библиотеки F#

Поддерживается в: 2.0, 4.0, портативное

См. также

Ссылки

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

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