2010-10-02 2 views
3

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

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

Edit: Вопрос может быть оформлена как: Есть ли эквивалент Rx.Observable.FromArray([1,2,3]), как показано here в 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() 
+0

Я не совсем получить требуемое поведение. Вы имеете в виду последовательность наблюдаемых, объединенных в одну? 'fold' над' merge' возможно;) – Dario

+0

@ Dario: Я имел в виду, что мне нужна была возможность подписаться на последовательность. Например, я бы взял список и скрыл его в наблюдаемом, который запускает последовательные события, каждый из которых несет одного члена списка. –

ответ

0

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

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

+0

Должно быть, но это не так. Для кого-то, чей первый язык .Net - F #, сообщество (и Microsoft) делает удивительно трудным найти, как использовать эти вещи. Вы знаете, какие сборки для загрузки и какие модули для открытия должны быть немного проще. –

10

На всякий случай вы хотели избежать дополнительной зависимости, на самом деле довольно просто реализовать поведение с использованием событий F # и функции Observable.guard, которую я уже использовал в another answer here at 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 } 
+0

Большое спасибо. Я действительно надеялся на что-то подобное. –

Смежные вопросы