有没有办法从F#中的序列创建一个observable?
所需的行为是订阅结果observable的观察者一次接收一个序列的所有值。
修改:问题可以理解为:F#中是否显示Rx.Observable.FromArray([1,2,3])
与here相同的内容?
编辑2 :谢谢大家。我花了一些时间才找到答案,却发现desco已经回答了。为了完整起见,这是它的工作原理:
//Using the Reactive Framework.
//References to System.CoreEx.dll and System.Reactive.dll are needed.
open System.Linq
let observable = Observable.ToObservable [1..10]
let odds = observable |> Observable.filter (fun i -> i%2=1)
let disp = odds.Subscribe (fun i -> printfn "%d" i)
disp.Dispose ()
答案 0 :(得分:11)
如果你想避免额外的依赖,实际上很容易使用我在another answer here at StackOverflow中使用的F#事件和Observable.guard
函数来实现这种行为。
以下是实施以及一个简短的例子:
module Observable =
let ofSeq s =
let evt = new Event<_>()
evt.Publish |> Observable.guard (fun o ->
for n in s do evt.Trigger(n))
[ 1 .. 10 ] |> Observable.ofSeq
|> Observable.filter (fun n -> n%2 = 0)
|> Observable.add (printfn "%d")
为了完整起见,Observable.guard
的实现如下:
/// Creates an observable that calls the specified function after someone
/// subscribes to it (useful for waiting using 'let!' when we need to start
/// operation after 'let!' attaches handler)
let guard f (e:IObservable<'Args>) =
{ new IObservable<'Args> with
member x.Subscribe(observer) =
let rm = e.Subscribe(observer) in f(); rm }
答案 1 :(得分:5)
System.Reactive.Linq.Observable.ToObservable(this IEnumerable source) 是否位于 System.Reactive.dll 中你想要的东西?
答案 2 :(得分:0)
你可以试试Reactive Extensions。请参阅以下博客条目,这可能会对您有所帮助。
http://www.navision-blog.de/2009/10/20/iobservableiobserver-using-the-reactive-framework-with-f/