可观察采取选择转换

时间:2011-12-30 18:17:39

标签: f# system.reactive

我正在学习RX(Reactive Extensions),我试图使用来自互联网的一些代码示例,源代码在C#中:

var input = new[] {1,2,3,4,5,4}.ToObservable();
var output = input.Take(5).Select(x => x * 10);

output.Dump();

我想用F#做同样的事情。我下载了RX,并创建了一个F#windows应用程序,添加了对System.Reactive的引用。我的IDE是VS 2010 Ultimate,RX版本是:1.1.11111这是我的代码:

#light
open System
open System.Collections.Generic
open System.Linq
open System.Reactive
open System.Reactive.Linq

let input = [1; 2; 3; 4; 5; 4].ToObservable()
let output = input.Take(5).Select(fun x -> printfn "%A" x)
printfn "%A" output
printfn "Done"

我认为这是一项轻松的工作,但是,在我的IDE中,C#和F#都没有提供任何有用的信息。此外,没有output.Dump()我可以在C#或F#中使用 F#中的lambda表达式没有显示任何信息 printfn "%A"输出显示了以下信息:

  

System.Reactive.Linq.Observable + SelectObservable`2 [System.Int32,Microsoft.FSharp   .Core.Unit]

如果我遗漏了某些内容或者我的代码是错误的,请告诉我 谢谢,祝大家新年快乐!

2 个答案:

答案 0 :(得分:1)

不确定为什么要这样做,但这会产生您期望的结果。

let input = [1; 2; 3; 4; 5; 4].ToObservable()
let output = input.Take(5).ToEnumerable()
printfn "%A" output

所有这一切都将#seq<int>转换为IObservable<int>然后再转回。我想如果你在调用ToEnumerable之前链接了一些额外的转换会更有意义。

答案 1 :(得分:1)

你应该learn about Observables更多。您必须订阅可观察的集合。此外,您不应该在Select方法中产生副作用。所以代码应该是这样的:

use xs = [1; 2; 3; 4; 5; 4].ToObservable().Take(5).Subscribe(printfn "%A")