Наблюдаемый из последовательности в F # - PullRequest
3 голосов
/ 02 октября 2010

Есть ли способ создания наблюдаемой из последовательности в F #?

Требуемое поведение состоит в том, что наблюдатель, подписывающийся на результирующую наблюдаемую, получает все значения последовательности по одному за раз.

Редактировать : Вопрос можно сформулировать следующим образом: есть ли эквивалент Rx.Observable.FromArray([1,2,3]), как показано здесь в F #?

Редактировать 2 : Спасибо всем. Мне потребовалось некоторое время, чтобы найти ответ, но обнаружил, что Деско уже ответил. Для полноты картины вот как это работает:

//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 ()

Ответы [ 3 ]

11 голосов
/ 02 октября 2010

На всякий случай, если вы хотите избежать дополнительной зависимости, на самом деле довольно легко реализовать поведение с использованием событий 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 } 
5 голосов
/ 02 октября 2010

Является ли System.Reactive.Linq.Observable.ToObservable (этот источник IEnumerable) , расположенный в System.Reactive.dll , тем, что вы хотели?

0 голосов
/ 02 октября 2010

Вы можете попробовать Reactive Extensions. Пожалуйста, обратитесь к следующей записи блога, которая может вам очень помочь.

* ** 1003 тысяча два *http://www.navision -blog.de / 2009/10/20 / iobservableiobserver-помощь-на-реактивной-рамка-с-F /
...