Osservabile dalla sequenza in F #
-
27-09-2019 - |
Domanda
C'è un modo per creare un osservabile da una sequenza in F #?
Il comportamento richiesto è che un osservatore sottoscrizione al osservabile risultante riceve tutti i valori della sequenza, uno alla volta.
Modifica : La domanda può essere inquadrata come: Esiste un equivalente Rx.Observable.FromArray([1,2,3])
come mostrato qui in F #?
Modifica 2 : Grazie a tutti. Mi c'è voluto del tempo per trovare la risposta, solo per scoprire che desco ha risposto già. Per ragioni di completezza, ecco come funziona:
//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 ()
Soluzione
System.Reactive.Linq .Observable.ToObservable (questa fonte IEnumerable) in System.Reactive.dll la cosa tua voluto?
Altri suggerimenti
Nel caso in cui si voleva evitare la dipendenza aggiuntiva, in realtà è abbastanza facile da implementare il comportamento utilizzando F # eventi e la funzione Observable.guard
che ho già utilizzato in un'altra risposta qui a StackOverflow .
Ecco l'implementazione insieme con un breve esempio:
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")
E per completezza, l'attuazione di sguardi Observable.guard
in questo modo:
/// 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 }
Yoou può provare reattivi estensioni. Si prega di fare riferimento alla seguente voce del blog che potrebbe aiutare molto.
http: / /www.navision-blog.de/2009/10/20/iobservableiobserver-using-the-reactive-framework-with-f/