如何在Rx中进行模式匹配.在一个运营商的哪里和选择?

Lay*_*lez 6 f# pattern-matching system.reactive

假设我有这种类型:

type T = int option
Run Code Online (Sandbox Code Playgroud)

以及该类型的可观察量:

let o : IObservable<T> = // create the observable
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种更好的表达方式:

o.Where(function | None -> false | Some t -> true)
 .Select(function | Some t -> t)
Run Code Online (Sandbox Code Playgroud)

一个只能传播Some案例的可观察者.

有几件事我不喜欢.

  • 我正在使用2个运营商
  • 我模式匹配两次
  • 第二种模式匹配并不详尽(使视觉工作室显示警告并感觉奇怪)
  • 代码太多了.每次我需要模式匹配时,模式都会重复.

Seh*_*cht 4

你不能使用Observable.choose吗?像这样的东西:

let o1 : IObservable<int option> = // ...
let o2 = Observable.choose id o1
Run Code Online (Sandbox Code Playgroud)

如果您无法选择某个类型,请说:

type TwoSubcases<'a,'b> = | Case1 of 'a | Case2 of 'b
Run Code Online (Sandbox Code Playgroud)

和部分活动模式:

let (|SecondCase|_|) = function
    | Case1 _ -> None
    | Case2 b -> Some b
Run Code Online (Sandbox Code Playgroud)

那么你可以这样做:

let o1 : IObservable<TwoSubcases<int, float>> = // ...
let o2 : IObservable<float> = Observable.choose (|SecondCase|_|) o1 
Run Code Online (Sandbox Code Playgroud)