3

F# のシーケンスからオブザーバブルを作成する方法はありますか?

必要な動作は、結果のオブザーバブルをサブスクライブするオブザーバーが、シーケンスのすべての値を一度に 1 つずつ受け取ることです。

編集: 質問は次のように組み立てることができます: Is there an equal to Rx.Observable.FromArray([1,2,3])as shown here in F#?

編集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

追加の依存関係を回避したい場合に備えて、ここ StackOverflow の別の回答でObservable.guard既に使用した F# イベントと関数を使用して動作を実装するのは実際には非常に簡単です。

簡単な例とともに実装を次に示します。

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.Linq.Observable.ToObservable(この IEnumerable ソース)System.Reactive.dllにありますか?

于 2010-10-02T13:01:22.733 に答える
0

Reactive Extensions を試すことができます。次のブログ エントリを参照してください。

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

于 2010-10-02T10:00:17.610 に答える