Pergunta

Existe uma maneira de criar um observável a partir de uma sequência em F#?

O comportamento necessário é que um observador assinando o observável resultante recebe todos os valores da sequência um de cada vez.

Editar: A pergunta pode ser enquadrada como: existe um equivalente a Rx.Observable.FromArray([1,2,3]) como mostrado aqui em f#?

Editar 2: Obrigado a todos. Levei algum tempo para encontrar a resposta, apenas para descobrir que a Desco já respondeu. Por uma questão de completude, eis como funciona:

//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 ()
Foi útil?

Solução

É System.Reactive.linq.observable.toobservable (essa fonte ienumerable) localizado em System.Retive.dll a coisa que você quer?

Outras dicas

Caso você queira evitar a dependência adicional, é realmente muito fácil implementar o comportamento usando eventos F# e Observable.guard função que eu já usei em Outra resposta aqui no Stackoverflow.

Aqui está a implementação junto com um breve exemplo:

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 para a completude, a implementação de Observable.guard se parece com isso:

/// 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 } 

Você pode tentar extensões reativas. Consulte a seguinte entrada do blog, o que pode ajudá -lo muito.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top