如何在F#中按长度将observable分成块

f#

如何将 observable 分成块,每个块的长度为 n

例如:

observable 发出事件 a, b, c, d, e, f .. ,长度为 3

结果发出 [a;b;c], [d, e, f], ...

splitIntoChunks: int -> IObservable<'a> -> IObservable<'a list>

splitIntoChunks len observable = ?

回答

为了使用 Observables,有FSharp.Control.Reactive提供了围绕Reactive Extensions for .NET 的包装器,所以

#r "nuget: System.Reactive"
#r "nuget: FSharp.Control.Reactive"

open FSharp.Control.Reactive

Observable.generate
    (0,1)
    (fun _ -> true)
    (fun (l, c) -> (c, l + c))
    snd
|> Observable.bufferCount 3
|> Observable.take 5
|> Observable.subscribe (printfn "%A")

产量

seq [1; 1; 2]
seq [3; 5; 8]
seq [13; 21; 34]
seq [55; 89; 144]
seq [233; 377; 610]

如果您需要列表,只需|> Observable.map Seq.toList在订阅前添加例如。


第一个版本,包括 NIH

为了使用 Observables,我会利用Reactive Extensions for .NET创建瘦包装器

#r "nuget: System.Reactive"

open System.Reactive.Linq

let chunkBySize (chunkSize : int) observable =
    Observable.Buffer(observable, chunkSize)

let take (count : int) observable =
    Observable.Take(observable, count)

并像这样使用它们

Observable.Generate(
    (0,1),
    (fun _ -> true),
    (fun (l, c) -> (c, l + c)),
    fun (_, r) -> r)
|> chunkBySize 3
|> take 5
|> Observable.subscribe (printfn "%A")

产生与上面相同的结果


以上是如何在F#中按长度将observable分成块的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>