2015-05-27 7 views
6

Supponiamo che io sono questo tipo:Come eseguire la corrispondenza del modello in Rx. Dove e Seleziona in un unico operatore?

type T = int option 

e un'osservabile di quel tipo:

let o : IObservable<T> = // create the observable 

Sto cercando un modo migliore per esprimere questo:

o.Where(function | None -> false | Some t -> true) 
.Select(function | Some t -> t) 

Un osservabile che si propaga solo nel caso Some.

Ci sono diverse cose che non mi piacciono.

  • sto usando 2 operatori
  • Sono pattern matching due volte
  • Il secondo pattern matching non è esaustivo (rende visual studio mostrano un messaggio di avviso e si sente dispari)
  • troppo codice. Il pattern si ripete ogni volta che ho bisogno di un pattern matching.
+2

Dovresti essere in grado di utilizzare 'SelectMany':' o.SelezionaMany (fun t -> t |> Option.toArray:> int seq) ' – Lee

+2

Suoni come [FSharp.Control.Reactive] (http://fsprojects.github.io/FSharp.Control.Reactive) manca una funzione' choose'. Il progetto prende probabilmente richieste pull :) –

+0

Sembra buono :) Si consiglia di pubblicare un link al tuo PR qui, in modo che i futuri visitatori possano indagare sul suo stato. –

risposta

4

Non è possibile utilizzare Observable.choose? qualcosa di simile:

let o1 : IObservable<int option> = // ... 
let o2 = Observable.choose id o1 

Se si dispone di un tipo che non è un'opzione, dire:

type TwoSubcases<'a,'b> = | Case1 of 'a | Case2 of 'b 

e un modello attivo parziale:

let (|SecondCase|_|) = function 
    | Case1 _ -> None 
    | Case2 b -> Some b 

allora si può fare:

let o1 : IObservable<TwoSubcases<int, float>> = // ... 
let o2 : IObservable<float> = Observable.choose (|SecondCase|_|) o1 
+0

Sì, hai ragione. Come mi sono perso ... E per altri tipi di unione, puoi usare un pattern attivo parziale invece di 'id'. –

4

Grazie a @Lee mi è venuta una buona soluzione.

o.SelectMany(function | None -> Observable.Empty() | Some t -> Observable.Return t) 

Questo funziona per qualsiasi tipo di unione, non solo Opzione.