3

有没有办法从 F# 中的序列创建一个 observable?

所需的行为是订阅结果 observable 的观察者一次接收一个序列的所有值。

编辑:问题可以表述为:F# 中是否有与此处Rx.Observable.FromArray([1,2,3])所示的等价物?

编辑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 ()
4

3 回答 3

11

以防万一你想避免额外的依赖,使用 F# 事件和Observable.guard函数来实现行为实际上很容易,我已经在 StackOverflow 的另一个答案中使用过。

这是实现和一个简短的示例:

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 } 
于 2010-10-02T16:41:09.903 回答
5

位于System.Reactive.dll中的System.Reactive.Linq.Observable.ToObservable(this IEnumerable source)是您想要的吗?

于 2010-10-02T13:01:22.733 回答
0

你可以试试反应式扩展。请参阅以下博客条目,这可能对您有很大帮助。

http://www.navision-blog.de/2009/10/20/iobservableiobserver-using-the-reactive-framework-with-f/

于 2010-10-02T10:00:17.610 回答