我正在学习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]
如果我遗漏了某些内容或者我的代码是错误的,请告诉我 谢谢,祝大家新年快乐!
答案 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")