如何在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")
产生与上面相同的结果