Ниже приведен «прямой перевод» на F # из C #:
open System
open System.Reactive
open System.Reactive.Linq
printfn "Current Time: %A" DateTime.Now
let source = Observable.Timer(TimeSpan.FromSeconds(5.0), TimeSpan.FromSeconds (1.0)).Timestamp()
using (source.Subscribe(fun (x:Timestamped<int64>) -> printfn "%A %A" x.Value x.Timestamp))
(fun _ ->
printfn "Press any key to unsubscribe"
Console.ReadKey() |> ignore
)
printfn "Press any key to stop"
Console.ReadKey() |> ignore
Во время работы дайте ему пройти 5 секунд, чтобы увидеть, как начинают поступать события таймера в течение 1 секунды.
ADDENDUM : Тип входного аргумента в лямбда-выражении, который, в свою очередь, является аргументом Iobservable.Subscribe()
, является типом значений IObservable
, которые мы называем Subscribe()
, т.е. тип значений, составляющих IObservable
source
.
В свою очередь, source
представляет результат метода Observable.Timer(DateTimeOffset, TimeSpan)
, который возвращает наблюдаемую последовательность, которая создает значение в установленное время, а затем после каждого периода. Эта последовательность имеет тип IObservable<int64>
.
Timestamp()
метод при применении к IObservable<int64>
дает IObservable<Timestamped<int64>>
.
Итак, в конечном итоге наш source
равен IObservable
типа Timestamped<int64>
, который приведенный выше фрагмент кода отражает как явный тип аргумента x
анонимной функции в Subscribe()
.