F# 如何在Rx中进行模式匹配。在单个运算符中的何处选择?

F# 如何在Rx中进行模式匹配。在单个运算符中的何处选择?,f#,pattern-matching,system.reactive,F#,Pattern Matching,System.reactive,假设我有这种类型: type T = int option 以及该类型的可观察物: let o : IObservable<T> = // create the observable 仅传播某些情况的可观察对象 有几件事我不喜欢 我用了两个操作符 我做了两次模式匹配 第二种模式匹配并不详尽(使VisualStudio显示警告并感到奇怪) 太多的代码。每次我需要模式匹配时,模式都会重复 多亏了@Lee,我想出了一个很好的解决方案 o.SelectMany(function | N

假设我有这种类型:

type T = int option
以及该类型的可观察物:

let o : IObservable<T> = // create the observable
仅传播
某些
情况的可观察对象

有几件事我不喜欢

  • 我用了两个操作符
  • 我做了两次模式匹配
  • 第二种模式匹配并不详尽(使VisualStudio显示警告并感到奇怪)
  • 太多的代码。每次我需要模式匹配时,模式都会重复

    • 多亏了@Lee,我想出了一个很好的解决方案

      o.SelectMany(function | None -> Observable.Empty() | Some t -> Observable.Return t)
      
      这适用于任何联合类型,而不是唯一的选项。

      您不能使用吗?大概是这样的:

      let o1 : IObservable<int option> = // ...
      let o2 = Observable.choose id o1
      
      然后你可以做:

      let o1 : IObservable<TwoSubcases<int, float>> = // ...
      let o2 : IObservable<float> = Observable.choose (|SecondCase|_|) o1 
      
      让o1:IObservable=/。。。
      让o2:IObservable=Observable.choose(| SecondCase | | | |)o1
      
      您应该能够使用
      SelectMany
      o.SelectMany(趣味t->t |>Option.toArray:>int-seq)
      听起来好像缺少
      choose
      功能。该项目可能需要拉取请求:)听起来不错:)您可能希望在此处发布一个指向您的PR的链接,以便将来的访问者可以调查其状态。是的,您是对的。我怎么会错过它。。。对于其他联合类型,可以使用部分活动模式而不是
      id
      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