F# Observable.GroupBy在F中的用法示例#

F# Observable.GroupBy在F中的用法示例#,f#,system.reactive,F#,System.reactive,我试图确定如何在反应式扩展中使用groupby函数。有没有可能有人用一个简单的例子来说明它在F#中的用法 谢谢 您最可能面临的问题是,当与Func、Action等相关时,lambda很难进行F#的类型推断,尤其是在具有多个重载的方法中 如果您使用的是Rx的API,它是为惯用C#/VB设计的,那么在大多数情况下,您将不得不对类型进行注释,以将编译器指向正确的方向 GroupBy以其最简单的形式接受一个键选择器,并生成一个可观察的组。每个组都有一个键,并且本身是一个可观察的,它是该键下的一个值流 在

我试图确定如何在反应式扩展中使用groupby函数。有没有可能有人用一个简单的例子来说明它在F#中的用法


谢谢

您最可能面临的问题是,当与
Func
Action
等相关时,lambda很难进行F#的类型推断,尤其是在具有多个重载的方法中

如果您使用的是Rx的API,它是为惯用C#/VB设计的,那么在大多数情况下,您将不得不对类型进行注释,以将编译器指向正确的方向

GroupBy以其最简单的形式接受一个键选择器,并生成一个可观察的组。每个组都有一个键,并且本身是一个可观察的,它是该键下的一个值流

在本例中,我们将形成两个组:偶数组或奇数组,因此您将得到两个
IGroupedObservable
,并且
SelectMany
用于重新组合这些组

使用常规接收方法:

let log message s = printfn "%s: %A" message s       

let disposable = 
    Observable.Interval(TimeSpan.FromSeconds(0.5))
              .Select(int)              
              .Do(log "Produced")
              .GroupBy(fun n -> if n % 2 = 0 then "Even" else "Odd")
              .SelectMany(fun (group : IGroupedObservable<string, int>) -> group.Select(fun i -> group.Key, i))          
              .Do(log "Kind")
              .Subscribe()              
…更具可读性且无需注释

输出:

Produced: 0
Kind: ("Even", 0)
Produced: 1
Kind: ("Odd", 1)
Produced: 2
Kind: ("Even", 2)
Produced: 3
Kind: ("Odd", 3)

您最可能面临的问题是,当与
Func
Action
等相关时,lambdas很难使用F#的类型推断,尤其是在具有多个重载的方法中

如果您使用的是Rx的API,它是为惯用C#/VB设计的,那么在大多数情况下,您将不得不对类型进行注释,以将编译器指向正确的方向

GroupBy以其最简单的形式接受一个键选择器,并生成一个可观察的组。每个组都有一个键,并且本身是一个可观察的,它是该键下的一个值流

在本例中,我们将形成两个组:偶数组或奇数组,因此您将得到两个
IGroupedObservable
,并且
SelectMany
用于重新组合这些组

使用常规接收方法:

let log message s = printfn "%s: %A" message s       

let disposable = 
    Observable.Interval(TimeSpan.FromSeconds(0.5))
              .Select(int)              
              .Do(log "Produced")
              .GroupBy(fun n -> if n % 2 = 0 then "Even" else "Odd")
              .SelectMany(fun (group : IGroupedObservable<string, int>) -> group.Select(fun i -> group.Key, i))          
              .Do(log "Kind")
              .Subscribe()              
…更具可读性且无需注释

输出:

Produced: 0
Kind: ("Even", 0)
Produced: 1
Kind: ("Odd", 1)
Produced: 2
Kind: ("Even", 2)
Produced: 3
Kind: ("Odd", 3)
F#类型推理处理管道样式的效果也比处理fluent样式好。F#类型推理处理管道样式的效果也比处理fluent样式好。