2015-05-27 4 views
6

मान लीजिए मैं इस प्रकार है:आरएक्स में पैटर्न मिलान कैसे करें। एक ऑपरेटर में कहां और चुनें?

type T = int option 

और उस प्रकार का एक नमूदार:

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

मैं एक बेहतर तरीका के लिए देख रहा हूँ इस व्यक्त करने के लिए:

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

एक अवलोकन योग्य जो केवल Some मामले का प्रचार करता है।

ऐसी कई चीजें हैं जिन्हें मैं पसंद नहीं करता हूं।

  • मैं 2 ऑपरेटरों
  • मैं दो बार
  • मिलान दूसरा पैटर्न मिलान संपूर्ण नहीं है पैटर्न हूँ का उपयोग कर (दृश्य स्टूडियो चेतावनी दिखाने बनाता है और अजीब लगता है)
  • बहुत ज्यादा कोड रहा हूँ। जब भी मुझे पैटर्न मिलान की आवश्यकता होती है तो पैटर्न दोहराता है।
+2

आपको 'SelectMany' का उपयोग करने में सक्षम होना चाहिए:' o.SelectMany (मजेदार टी -> टी |> Option.toArray:> int seq) ' – Lee

+2

लगता है जैसे [FSharp.Control.Reactive] (http://fsprojects.github.io/FSharp.Control.Reactive) में 'select' फ़ंक्शन' गुम है। प्रोजेक्ट शायद पुल अनुरोध लेता है :) –

+0

अच्छा लगता है :) आप यहां अपने पीआर के लिए एक लिंक पोस्ट करना चाहते हैं, ताकि भविष्य के आगंतुक इसकी स्थिति की जांच कर सकें। –

उत्तर

4

क्या आप Observable.choose का उपयोग नहीं कर सकते? कुछ इस तरह:

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

आप एक प्रकार है कि एक विकल्प नहीं है है, तो कहते हैं:

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

और एक आंशिक सक्रिय पैटर्न:

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

तो आप कर सकते हैं:

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

हाँ, आप सही हैं। मुझे इसे कैसे याद आया ... और अन्य संघ प्रकारों के लिए, आप 'id' के बजाय आंशिक सक्रिय पैटर्न का उपयोग कर सकते हैं। –

4

धन्यवाद @Lee मैं एक अच्छा समाधान के साथ आया था।

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

यह किसी भी यूनियन प्रकार के लिए काम करता है, न केवल विकल्प।

संबंधित मुद्दे